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