用户可以控制其父 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 并分配 PopupWindowActionWindowStyle.

的用户控件

调用使用控件的新代码:

添加资源

<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>

子代无法直接更改其父代的样式,因为视觉树模型设计为从广泛到具体(WindowUserControl...),样式在该方向上被继承和覆盖.也就是说,一切皆有可能,因为它只是代码!

这不是一个很好的方法,但是您可以在后面的代码中使用 UserControlLoaded 方法来完成导航可视化树的工作以找到父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 下的项目。

在这种情况下,您可能需要查看 PopupWindowActionWindowStyle 属性。你应该可以在那里设置样式。