在WPF中创建一个公共窗口

时间:2009-02-19 17:00:01

标签: wpf

如何在WPF中创建常见的窗口外观?我不是在谈论仅仅设计窗口的样式,我的意思是有一个窗口,边框,网格和其他一些东西。

感谢。

2 个答案:

答案 0 :(得分:5)

您可以为窗口创建ControlTemplate。这是一个非常基本的例子,它有一些控件和触发器。您可以轻松添加更多元素,以满足您的需求。

   <ControlTemplate x:Key="MyWindowTemplate" TargetType="{x:Type Window}">
      <Border x:Name="WindowBorder" Style="{DynamicResource WindowBorderStyle}">
         <Grid>
            <Border Margin="4,4,4,4" Padding="0,0,0,0" x:Name="MarginBorder">
               <AdornerDecorator>
                  <ContentPresenter/>
               </AdornerDecorator>
            </Border>
            <ResizeGrip Visibility="Collapsed" IsTabStop="false" HorizontalAlignment="Right" x:Name="WindowResizeGrip" 
                    VerticalAlignment="Bottom" />
         </Grid>
      </Border>
      <ControlTemplate.Triggers>
         <MultiTrigger>
            <MultiTrigger.Conditions>
               <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
               <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
            <Setter Property="Margin" TargetName="MarginBorder" Value="4,4,4,20" />
         </MultiTrigger>
         <Trigger Property="WindowState" Value="Maximized">
            <Setter Property="CornerRadius" TargetName="WindowBorder" Value="0,0,0,0"/>
         </Trigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>

您可以通过设置Window的模板属性来使用此ControlTemplate:

   Template="{StaticResource MyWindowTemplate}"

您需要将此功能与此类样式结合使用:

   <Style x:Key="MyWindowStyle" TargetType="{x:Type Window}">
      <Setter Property="AllowsTransparency" Value="False" />
      <Setter Property="WindowStyle" Value="SingleBorderWindow" />
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
      <Setter Property="Background" Value="Transparent" />
      <Setter Property="ShowInTaskbar" Value="False" />
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
               <Border>
                  <AdornerDecorator>
                     <ContentPresenter/>
                  </AdornerDecorator>
               </Border>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>

并在窗口上设置样式:

Style="{StaticResource MyWindowStyle}"

答案 1 :(得分:0)

我最终做的是创建一个基类,在每个窗口中创建我想要的UI代码。这允许我为控件设置事件并在基类中进行事件订阅。如果有更好的方法,比如使用xaml,我想知道。

public WindowBase()
{
    Initialized += WindowBase_Initialized;
}

private void WindowBase_Initialized( object sender, EventArgs e )
{
    Border border = new Border();
    border.SetResourceReference( Control.StyleProperty, "WindowBorder" );

    border.Child = new ContentPresenter { Content = this.Content};

    this.Content = border;
}