如何从 main window 隐藏用户控件中的按钮?

how to Hide buttons in usercontrol from main window?

我有一个有多个按钮的用户控件,在应用程序中我在多个 windows 上使用此用户控件,但我想折叠 (shown/hidden) 一些按钮,如果用户 select 在应用程序 a window 1 中,如果用户 select 在应用程序 a window 2

中显示相同的按钮

用户控件

<Grid x:Name="girdBtuWidow" >
    <StackPanel Orientation="Horizontal">
        <Button Content="add" x:Name="add" Visibility="{Binding window1_Loaded}" x:FieldModifier="public" Height="50"  Width="100" Margin="0"  Click="add_click"  />
        <Button Content="show history" x:Name="Personal" Height="50"  Width="100" Margin="0" />
        <Button Content="Show Customer" x:Name="Customer" Height="50"  Width="100" Margin="0" />
    </StackPanel>
</Grid>

如何从应用程序 window 设置用户控件中按钮的 属性(可见性)?

您不需要在此处使用 Window_Loaded 事件。

您需要为 UserControls 中的每个按钮公开一个 Visibility 属性。

在您的 UserControl 中为 Visibility 属性 的每个按钮添加绑定:

Visibility="{Binding AddButtonVisibility}"
Visibility="{Binding ShowHistoryButtonVisibility}"
Visibility="{Binding ShowCustomerButtonVisibility}"

确保你在你的UserControl中添加一个DataContext,我通常使用Self:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

在您的 UserControl 代码隐藏中为上面的每个绑定添加依赖属性:

    public Visibility AddButtonVisibility
    {
        get { return (Visibility)GetValue(AddButtonVisibilityProperty); }
        set { SetValue(AddButtonVisibilityProperty, value); }
    }

    // Using a DependencyProperty as the backing store for AddButtonVisibility.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AddButtonVisibilityProperty =
        DependencyProperty.Register("AddButtonVisibility", typeof(Visibility), typeof(UserControl1), new PropertyMetadata(Visibility.Visible));


    public Visibility ShowHistoryButtonVisibility
    {
        get { return (Visibility)GetValue(ShowHistoryButtonVisibilityProperty); }
        set { SetValue(ShowHistoryButtonVisibilityProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ShowHistoryButtonVisibility.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ShowHistoryButtonVisibilityProperty =
        DependencyProperty.Register("ShowHistoryButtonVisibility", typeof(Visibility), typeof(UserControl1), new PropertyMetadata(Visibility.Visible));



    public Visibility ShowCustomerButtonVisibility
    {
        get { return (Visibility)GetValue(ShowCustomerButtonVisibilityProperty); }
        set { SetValue(ShowCustomerButtonVisibilityProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ShowCustomerButtonVisibility.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ShowCustomerButtonVisibilityProperty =
        DependencyProperty.Register("ShowCustomerButtonVisibility", typeof(Visibility), typeof(UserControl1), new PropertyMetadata(Visibility.Visible));

在 Visual Studio 中,有一个依赖属性的代码片段快捷方式 - 输入 propdp 并点击 tab 两次。

现在,要使用您刚刚创建的属性,请将 Usercontrol 放到相关的 window:

<local:UserControl1 AddButtonVisibility="Collapsed" />

local 是项目命名空间的别名 - 在 Window 的顶部定义。您只需将 UserControl 拖放到 window 上,它就会为您执行此操作。 (您可能需要重建才能在您的工具箱中看到您的 UserControls

您现在应该会看到带有 Add Button 的控件已折叠。

为了完整起见,这里是 XAML 方面的内容:

用户控件Xaml:

<UserControl x:Class="WpfApplication2.UserControl1"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid x:Name="girdBtuWidow" >
    <StackPanel Orientation="Horizontal">
        <Button Content="Add" x:Name="add" Height="50"  Width="100" Margin="0" Click="Add_Click" Visibility="{Binding AddButtonVisibility}"/>
        <Button Content="Show History" x:Name="Personal" Height="50"  Width="100" Margin="0" Click="ShowHistory_Click" Visibility="{Binding ShowHistoryButtonVisibility}" />
        <Button Content="Show Customer" x:Name="Customer" Height="50"  Width="100" Margin="0" Click="ShowCustomer_Click" Visibility="{Binding ShowCustomerButtonVisibility}"/>
    </StackPanel>
</Grid>

Window1.Xaml:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2" x:Class="WpfApplication2.Window1"
    Title="Window1" Height="300" Width="308">
<Grid>
    <local:UserControl1 HorizontalAlignment="Left" VerticalAlignment="Top" AddButtonVisibility="Collapsed" />
</Grid>

public static readonly DependencyProperty onBackVisibilityProperty =
     DependencyProperty.Register("onBackVisibility", typeof(Visibility), typeof(MyToolBar), new PropertyMetadata(Visibility.Visible));
    public Visibility onBackVisibility
    {
        get { return (Visibility)GetValue(onBackVisibilityProperty); }
        set { SetValue(onBackVisibilityProperty, value); }
    }

//之后转到xaml

public static readonly DependencyProperty onBackVisibilityProperty =
     DependencyProperty.Register("onBackVisibility", typeof(Visibility), typeof(MyToolBar), new PropertyMetadata(Visibility.Visible));
    public Visibility onBackVisibility
    {
        get { return (Visibility)GetValue(onBackVisibilityProperty); }
        set { SetValue(onBackVisibilityProperty, value); }
    }

Button Name="tbrBack" 
ToolTip="{DynamicResource Back}" 
VerticalAlignment="Center" 
VerticalContentAlignment="Center" 
Click="tbrBack_Click" 
Visibility="{Binding onBackVisibility ,ElementName = usercontrol}