用户可以控制其父 window 的样式吗?
Can a user control style its parent window?
我有一个使用 Prism PopupWindowAction
显示在弹出对话框中的用户控件。我不希望 window 可以调整大小。是否可以从用户控件中设置此 window 的样式?我试图使用这个:
<UserControl.Resources>
<Style x:Key="WindowStyle" TargetType="{x:Type Window}">
<Setter Property="ResizeMode" Value="NoResize" />
</Style>
</UserControl.Resources>
但它不起作用。
编辑:
根据接受的答案,我将样式移至定义 IteractionRequestTrigger
并分配 PopupWindowAction
的 WindowStyle
.
的用户控件
调用使用控件的新代码:
添加资源
<UserControl.Resources>
<Style x:Key="WindowStyle" TargetType="Window">
<Setter Property="ResizeMode" Value="NoResize" />
<Setter Property="SizeToContent" Value="WidthAndHeight" />
</Style>
</UserControl.Resources>
弹出Window声明
<prism:InteractionRequestTrigger SourceObject="{Binding InteractionRequest}">
<prism:PopupWindowAction WindowStyle="{StaticResource WindowStyle}">
<prism:PopupWindowAction.WindowContent>
<sharedV:InformationDialog />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
子代无法直接更改其父代的样式,因为视觉树模型设计为从广泛到具体(Window
到 UserControl
...),样式在该方向上被继承和覆盖.也就是说,一切皆有可能,因为它只是代码!
这不是一个很好的方法,但是您可以在后面的代码中使用 UserControl
的 Loaded
方法来完成导航可视化树的工作以找到父Window
并强行设置ResizeMode
属性。您可以使用 this.Parent
并检查 is Window
何时为真,或者您可以使用 VisualTreeHelper.GetParent.
XAML:
<UserControl Loaded="OnLoaded"></UserControl>
C#:
private void OnLoaded(object sender, RoutedEventArgs e)
{
var currentParent = Parent;
while (currentParent != null && !(currentParent is Window))
{
currentParent = VisualTreeHelper.GetParent(currentParent);
}
if (currentParent is Window parentWindow)
{
parentWindow.ResizeMode = ResizeMode.NoResize;
}
}
您的 XAML 不起作用的原因是:
- 您创建的样式是明确的 - 它有一个
x:Key
。显式样式必须直接应用于目标元素 <Window Style="{StaticResource WindowStyle}" ... />
- 即使您删除
x:Key
并将其设为隐式样式,因为它是在 UserControl
的资源中定义的,所以它只会应用于树中 UserControl 下的项目。
在这种情况下,您可能需要查看 PopupWindowAction
的 WindowStyle
属性。你应该可以在那里设置样式。
我有一个使用 Prism PopupWindowAction
显示在弹出对话框中的用户控件。我不希望 window 可以调整大小。是否可以从用户控件中设置此 window 的样式?我试图使用这个:
<UserControl.Resources>
<Style x:Key="WindowStyle" TargetType="{x:Type Window}">
<Setter Property="ResizeMode" Value="NoResize" />
</Style>
</UserControl.Resources>
但它不起作用。
编辑:
根据接受的答案,我将样式移至定义 IteractionRequestTrigger
并分配 PopupWindowAction
的 WindowStyle
.
调用使用控件的新代码:
添加资源
<UserControl.Resources>
<Style x:Key="WindowStyle" TargetType="Window">
<Setter Property="ResizeMode" Value="NoResize" />
<Setter Property="SizeToContent" Value="WidthAndHeight" />
</Style>
</UserControl.Resources>
弹出Window声明
<prism:InteractionRequestTrigger SourceObject="{Binding InteractionRequest}">
<prism:PopupWindowAction WindowStyle="{StaticResource WindowStyle}">
<prism:PopupWindowAction.WindowContent>
<sharedV:InformationDialog />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
子代无法直接更改其父代的样式,因为视觉树模型设计为从广泛到具体(Window
到 UserControl
...),样式在该方向上被继承和覆盖.也就是说,一切皆有可能,因为它只是代码!
这不是一个很好的方法,但是您可以在后面的代码中使用 UserControl
的 Loaded
方法来完成导航可视化树的工作以找到父Window
并强行设置ResizeMode
属性。您可以使用 this.Parent
并检查 is Window
何时为真,或者您可以使用 VisualTreeHelper.GetParent.
XAML:
<UserControl Loaded="OnLoaded"></UserControl>
C#:
private void OnLoaded(object sender, RoutedEventArgs e)
{
var currentParent = Parent;
while (currentParent != null && !(currentParent is Window))
{
currentParent = VisualTreeHelper.GetParent(currentParent);
}
if (currentParent is Window parentWindow)
{
parentWindow.ResizeMode = ResizeMode.NoResize;
}
}
您的 XAML 不起作用的原因是:
- 您创建的样式是明确的 - 它有一个
x:Key
。显式样式必须直接应用于目标元素<Window Style="{StaticResource WindowStyle}" ... />
- 即使您删除
x:Key
并将其设为隐式样式,因为它是在UserControl
的资源中定义的,所以它只会应用于树中 UserControl 下的项目。
在这种情况下,您可能需要查看 PopupWindowAction
的 WindowStyle
属性。你应该可以在那里设置样式。