Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用户内容对另一个用户控件WPF隐藏?_C#_Wpf - Fatal编程技术网

C# 如何使用户内容对另一个用户控件WPF隐藏?

C# 如何使用户内容对另一个用户控件WPF隐藏?,c#,wpf,C#,Wpf,我有一个WPF页面的层次结构,如下所示: 该页面包含: ->用户控制1 ->用户控件2->用户控件3或用户控件4或用户控件5 我在用户控件2中有选项卡控件和选项卡项,用户控件2中选项卡项的内容是用户控件3 用户控件1包含一个组合框,该组合框包含三种不同的状态,因此当用户单击此组合框(事件选择\u更改)时,用户控件2中选项卡项的内容将根据用户在组合框中选择的内容而更改,并获取用户控件3或用户控件4或用户控件5 我希望每次用户选择不同的组合框项目时,选项卡项目的内容都会发生更改 我的方法是使选项卡项

我有一个WPF页面的层次结构,如下所示:

该页面包含:

->用户控制1

->用户控件2->用户控件3或用户控件4或用户控件5

我在用户控件2中有选项卡控件和选项卡项,用户控件2中选项卡项的内容是用户控件3

用户控件1包含一个组合框,该组合框包含三种不同的状态,因此当用户单击此组合框(事件选择\u更改)时,用户控件2中选项卡项的内容将根据用户在组合框中选择的内容而更改,并获取用户控件3或用户控件4或用户控件5

我希望每次用户选择不同的组合框项目时,选项卡项目的内容都会发生更改

我的方法是使选项卡项中调用的用户控件隐藏,并根据所选内容更改它

我现在需要的是,当我更改用户控件1中存在的组合框时,如何使用户控件2中的选项卡项(UC1或UC2,或UC3)的内容从页面可见

UC_2.xaml

   <TabItem x:Name="Tabitem1" Grid.Row="2"   Height="auto" Width="auto" >
                <Border BorderBrush="Black" Background="White" BorderThickness="0.8" DockPanel.Dock="Top">

                    <DockPanel Visibility="Hidden" x:Name="dockpanel1" Width="auto" Height="auto">
                     <!--   <local1:UC_3 x:Name="UC3" />-->
                        <Frame  x:Name="frame1"  Width="auto" Height="auto" Source="UC3.xaml"></Frame>

                    </DockPanel>
                </Border>
更新:

Page.xaml

 <StackPanel Grid.Row="1" Width="auto" Height="auto" >
            <DockPanel Width="1000" Height="400" HorizontalAlignment="Right">
                <local1:UC2 Width="1002" Height="400" VerticalAlignment="Top"/>
            </DockPanel>
        </StackPanel>

您可以使用以下帮助器方法从
UserControl
获取对父
页面的引用:

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);
    if (parent == null)
        return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}
私有静态T FindParent(DependencyObject DependencyObject),其中T:DependencyObject
{
var parent=VisualTreeHelper.GetParent(dependencyObject);
如果(父项==null)
返回null;
var parentT=作为T的父项;
返回父母??找到父母(父母);
}
示例用法:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Page1 parentPage = FindParent<Page1>(this);
    if (parentPage != null)
    {
        parentPage.ucsecond.dockpanel1.Visibility = Visibility.Visible;
        ...
    }
    ...
}
private void组合框\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
Page1 parentPage=FindParent(此);
if(parentPage!=null)
{
parentPage.ucsecond.dockpanel1.Visibility=可见性.Visibility;
...
}
...
}

我把它贴在了我的答案上……复制粘贴?这是一个自定义方法,您必须将其包含在代码中。我使用页面中的控件(而不是调用的用户控件)测试了您的解决方案,它可以正常工作,问题是我调用了页面中的用户控件,就像我在更新部分添加的那样。更新:现在可以使用了,谢谢:)与WPF开发的许多方面一样,这可以通过采用MVVM设计模式以更直接的方式实现——每个控件仅通过数据绑定与ViewModel交互,而不是相互交互。另外,不需要使用框架来承载另一个UserControl。对于框架的使用,我在Stackoverflow中看到了一个解决方案,框架有助于获得UC控件的控件
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Page1 parentPage = FindParent<Page1>(this);
    if (parentPage != null)
    {
        parentPage.ucsecond.dockpanel1.Visibility = Visibility.Visible;
        ...
    }
    ...
}