2016-11-15 117 views
0

我有一个WPF C#应用程序,其中包含一些视图(xaml),尤其是选项视图。在这个视图中有一个复选框来隐藏所有按钮。隐藏WPF应用程序中的所有按钮

问题,该怎么做?

我有一个MainStyle.xaml这是一个ResourceDictionary并包含所有样式,转换器等。我的方法是设置样式在这个文件中,如:

<Style TargetType="Button"> 
    <Setter Property="Visibility" Value="Collapsed" /> 
</Style> 

这工作,但用户必须决定是否按钮是可见或不可见。所以我必须将样式绑定到复选框。

第一步将把样式绑定到ResourceDictionary(MainStyle.xaml)后面的代码。但它不起作用。我已经将构造函数中的属性设置为false,但按钮是可见的。

MainStyle.xaml

<Style TargetType="Button"> 
    <Setter Property="Visibility" 
      Value="{Binding ButtonsEnabled, RelativeSource={RelativeSource AncestorType=ResourceDictionary}, Converter={StaticResource BooleanVisibilityConverter}}" /> 
</Style> 

代码隐藏(MainStyle.xaml.cs)

public partial class BaseStyle : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public BaseStyle() 
    { 
     InitializeComponent(); 
     ButtonsEnabled = false; // for testing 
    } 

    private Boolean buttonsEnabled; 


    public bool ButtonsEnabled 
    { 
     get { return buttonsEnabled; } 
     set 
     { 
      buttonsEnabled = value; 
      NotifyPropertyChanged("ButtonsEnabled"); 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

如果绑定工作,第二步是绑定在风格ResourceDictionary到选项视图。

+0

首先检查您的VS输出窗口,以搜索失败的绑定。然后启动Snoop并检查Visibility属性中是否有失败的按钮(以红色突出显示)。如果你能发现真正的失败,那么你可以开始正确的解决方案。 – LordWilmore

回答

0

如果您无法直接从绑定中找到复选框,那么带有继承的附加属性将适用于您。例如,下面的XAML:

<UserControl x:Class="WpfSpikes.InheritedAttachPropertyView" x:Name="View" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfSpikes" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
     <Style x:Key="VisibleButtonStyle" TargetType="{x:Type Button}"> 
      <Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=(local:ButtonVisibility.IsVisible), Converter={StaticResource BooleanToVisibilityConverter}}"/> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <CheckBox Content="Show Buttons?" IsChecked="{Binding ElementName=View, Path=(local:ButtonVisibility.IsVisible), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <Button Grid.Row="1" Content="Button1" Style="{StaticResource VisibleButtonStyle}"/> 
     <Button Grid.Row="2" Content="Button2" Style="{StaticResource VisibleButtonStyle}"/> 
     <Button Grid.Row="3" Content="Button3" Style="{StaticResource VisibleButtonStyle}"/> 
     <Button Grid.Row="4" Content="Button4" Style="{StaticResource VisibleButtonStyle}"/> 
    </Grid> 
</UserControl> 

使用该附加属性:

public static class ButtonVisibility 
{ 
    public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(ButtonVisibility), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits)); 

    public static bool GetIsVisible(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsVisibleProperty); 
    } 

    public static void SetIsVisible(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsVisibleProperty, value); 
    } 
} 

为了控制按钮可见性。

请注意,附加属性指定FrameworkPropertyMetadataOptions.Inherits,并且组合框绑定到名为View(即顶层用户控件)的元素上的此属性。然后,按钮样式将绑定到每个单独按钮级别的此属性(使用RelativeSource={RelativeSource Self}),该按钮位于UserControl内部,可以获取继承的IsVisible值。

适合我。希望能帮助到你。