如何将 UserControl 中的嵌套控件完全暴露给外部?
How do I fully expose a nested control in a UserControl to the outside?
假设我有一个非常简单的 UserControl
:
<UserControl x:Class="Test.UserControls.MyControl">
<DockPanel>
<Label Content="lorem" />
<Button Name="ButtonFromUserControl" />
</DockPanel>
</UserControl>
例如,如果我在另一个文件中添加 UserControl
,我想从外部访问 Button
的所有属性。我在想象这样的事情:
<StackPanel>
<usercontrols:MyControl Button.Dock="{Binding ButtonDockPosition}"/>
</StackPanel>
我知道我可以为每个 属性 创建依赖属性以使它们可以访问,但是我还不知道哪些以后可能会或可能不会被使用,并且不想添加 DP每个嵌套控件的属性。
我不确定这是否是正确的方法,如果有其他方法或模式我也会感兴趣。
编辑:
我也试图让 Button
本身成为一个 DP,但是那不允许我访问它的属性:
public static readonly DependencyProperty NestedButtonProperty =
DependencyProperty.RegisterAttached("NestedButton", typeof (Button), typeof (MyControl),
new FrameworkPropertyMetadata());
public Button NestedButton => ButtonFromUserControl;
我找到了一种解决方法,它至少不需要我生成大量转发 DP。由于大多数(或全部?)控件的属性也可以通过 Style
设置,我只是将每个控件的 Style
设置为 DP:
public static readonly DependencyProperty ButtonStyleProperty =
DependencyProperty.RegisterAttached("ButtonStyle", typeof (Style), typeof (MyUserControl),
new FrameworkPropertyMetadata());
public Style ButtonStyle
{
get { return (Style) GetValue(ButtonStyleProperty); }
set { SetValue(ButtonStyleProperty, value); }
}
绑定在UserControl
:
<Button Name="InnerButton" Style="{Binding ButtonStyle, ElementName=MyUserControl}" />
现在您可以使用自定义样式设置 Button
的属性:
<userControls:MyUserControl>
<userControls:MyUserControl.ButtonStyle>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Content" Value="ButtonContent" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush" Value="Orange" />
</Style.Setters>
</Style>
</userControls:MyUserControl.ButtonStyle>
</userControls:MyUserControl>
假设我有一个非常简单的 UserControl
:
<UserControl x:Class="Test.UserControls.MyControl">
<DockPanel>
<Label Content="lorem" />
<Button Name="ButtonFromUserControl" />
</DockPanel>
</UserControl>
例如,如果我在另一个文件中添加 UserControl
,我想从外部访问 Button
的所有属性。我在想象这样的事情:
<StackPanel>
<usercontrols:MyControl Button.Dock="{Binding ButtonDockPosition}"/>
</StackPanel>
我知道我可以为每个 属性 创建依赖属性以使它们可以访问,但是我还不知道哪些以后可能会或可能不会被使用,并且不想添加 DP每个嵌套控件的属性。
我不确定这是否是正确的方法,如果有其他方法或模式我也会感兴趣。
编辑:
我也试图让 Button
本身成为一个 DP,但是那不允许我访问它的属性:
public static readonly DependencyProperty NestedButtonProperty =
DependencyProperty.RegisterAttached("NestedButton", typeof (Button), typeof (MyControl),
new FrameworkPropertyMetadata());
public Button NestedButton => ButtonFromUserControl;
我找到了一种解决方法,它至少不需要我生成大量转发 DP。由于大多数(或全部?)控件的属性也可以通过 Style
设置,我只是将每个控件的 Style
设置为 DP:
public static readonly DependencyProperty ButtonStyleProperty =
DependencyProperty.RegisterAttached("ButtonStyle", typeof (Style), typeof (MyUserControl),
new FrameworkPropertyMetadata());
public Style ButtonStyle
{
get { return (Style) GetValue(ButtonStyleProperty); }
set { SetValue(ButtonStyleProperty, value); }
}
绑定在UserControl
:
<Button Name="InnerButton" Style="{Binding ButtonStyle, ElementName=MyUserControl}" />
现在您可以使用自定义样式设置 Button
的属性:
<userControls:MyUserControl>
<userControls:MyUserControl.ButtonStyle>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Content" Value="ButtonContent" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush" Value="Orange" />
</Style.Setters>
</Style>
</userControls:MyUserControl.ButtonStyle>
</userControls:MyUserControl>