【问题标题】:Toggle a grid by clicking a button通过单击按钮切换网格
【发布时间】:2012-12-19 00:20:25
【问题描述】:

我正在尝试通过单击 Button 来折叠 Grid。这就是我的Button 在 xaml 中的表示方式:

 <Button Grid.Column="1" Grid.RowSpan="3" Width="25" Content="&lt;&lt;" Click="OnClicked" x:Name="btnCollapse"></Button>

我想在单击此Button(类似于停靠窗口)时折叠Grid,并在再次单击Button 时恢复Grid。这就是我在后面的代码中这样做的方式:

private bool clicked;
private void OnClicked(object sender, RoutedEventArgs e)
{
    clicked             = !clicked;
    //leftPane is my grid
    leftPane.Visibility = clicked ? Visibility.Collapsed:Visibility.Visible;
    btnCollapse.Content = clicked ? ">>" : "<<";
}

这很好用,我的问题是我怎样才能纯粹在 xaml 中而不是在后面的代码中表示这个逻辑?

我的布局:

<Grid>
<Grid/>
<GridSplitter/>
</Grid>
<Button/>

【问题讨论】:

  • Mike 你打算如何在不使用事件处理程序的情况下触发 XAML 中的 OnClicked 事件..??
  • 如前所述,如果您想要纯 XAML,则必须避免单击事件处理程序。复选框而不是按钮怎么样?您不必手动实现逻辑来切换布尔属性,并且可以直接绑定到 IsChecked 属性。

标签: c# wpf button grid click


【解决方案1】:

您应该将Grid 的Visibility 依赖属性绑定到DataContext 中的布尔属性(应该实现INotifyPropertyChanged)并使用BooleanToVisibilityConverter:

private bool _isGridVisible;
public bool IsGridVisible
{
    get { return _isGridVisible; }
    set
    {
        if (_isGridVisible != value)
            return;
        _isGridVisible = value;
        OnPropertyChanged("IsGridVisible"); // This can sometimes be named RaisePropertyChanged
    }
}

private void OnClick(object sender, RoutedEventArgs e)
{
    IsGridVisible = !IsGridVisible;
}

在 XAML 中:

<Grid Visibility="{Binding IsGridVisible, Converter={StaticResource BooleanToVisibilityConverter}">
    <!-- stuff -->
</Grid>


如何设置按钮内容:

IValueConverter:

public class MyBooleanToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? ">>" : "<<";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<Button Click="OnClick" Content="{Binding IsGridVisible, Converter={StaticResource MyBooleanToStringConverter}}"/>

风格:

<Button Click="OnClick">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Content" Value="<<"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsGridVisible}" Value="False">
            <Setter Property="Content" Value=">>"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

【讨论】:

  • 谢谢,我将如何更改点击按钮的内容?
  • 有几种方法: 将Content属性绑定到一个字符串,该字符串的变化方式与bool相同;将Content 属性绑定到相同的布尔值并使用IValueConverter 将其转换为字符串;使用 Style 和 DataTriggers 设置按钮的 Content 属性。
猜你喜欢
  • 2017-09-23
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多