wpf通用窗体模板

最近一直很苦恼关于WPF窗口样式的问题,研究了好多Demo中的自定义样式,接下来整理下目前比较用的上的几种:
本篇写的是一个比较有限制的自定义窗口样式,如果只想实现icon和标题文本居中则可使用,不过注意:这个自定义样式与WindowsFormsHost控件是有冲突的。而且放大缩小关闭按钮会被盖住或模糊(应为在上面添加了相当于一层蒙版的感觉)。
下面是自定义样式,可写在资源字典Dictionary1.xaml中:代码中窗口标题行背景颜色的透明一定不能设置不透明,否则会将放大缩小关闭按钮遮盖住。如果对背景颜色没要求,建议不要设置背景颜色,或者把代码中标红部分变为0即可。

<!--通用窗口模板-icon和标题文本居中-保留窗口功能事件-->
    <ControlTemplate x:Key="FlatWindowTemplate" TargetType="{x:Type Window}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="1*"/>
            </Grid.RowDefinitions>
            <!-- Opacity of < 1.0 helps show the minimize, maximize and close buttons -->
            <Border Grid.Row="0" >
                <Border.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" Opacity="0.6">
                        <GradientStop Color="#FFFBFBFC" Offset="1"/>
                        <GradientStop Color="#FFF3F7FB" Offset="0.021"/>
                    </LinearGradientBrush>
                </Border.Background>
                <Grid VerticalAlignment="Center">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="5*" />
                        <ColumnDefinition Width="6*"/>
                    </Grid.ColumnDefinitions>
                    <StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" >
                    <!-- System Menu -->
                        <Button   Width="22"  HorizontalAlignment="Center" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
                                WindowChrome.IsHitTestVisibleInChrome="True" 
                                Command="{x:Static SystemCommands.ShowSystemMenuCommand}"
                                CommandParameter="{Binding ElementName=_MainWindow}">
                        <!-- Make sure there is a resource with name Icon in MainWindow -->
                            <Image 
                                Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                                WindowChrome.IsHitTestVisibleInChrome="True"/>
                    </Button>
                      
                    <!-- Window Title - Center Aligned -->
                        <TextBlock FontSize="13"
                            TextAlignment="Center"
                            VerticalAlignment="Center"
                            Text="{Binding Title, RelativeSource={RelativeSource TemplatedParent}}" />
                    </StackPanel>
                </Grid>
            </Border>
            <!-- This is the Window's main content area -->
            <!-- Top margin 44 = WindowChrome ResizeBorderThickness (4) + CaptionHeight(40) -->
            <!-- Bottom margin 1 is somewhat arbitrary -->
            <AdornerDecorator  Grid.Row="1"  >
                <Border Background="White" Opacity="1">
                    <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
            </Border>
            </AdornerDecorator>
        </Grid>
       
    </ControlTemplate>
   
   
    <!-- 通用窗口样式-icon和标题文本居中-保留窗口功能事件 -->
    <Style x:Key="FlatWindowStyle" TargetType="Window">
        <Setter Property="Template" Value="{StaticResource FlatWindowTemplate}"></Setter>
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome GlassFrameThickness="-1" ResizeBorderThickness="4" CaptionHeight="30"/>
            </Setter.Value>
        </Setter>
    </Style>


然后在window窗体中引用它:
 

Style="{DynamicResource FlatWindowStyle}" //window中添加,引用通用窗口样式
       
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/路径/Dictionary1.xaml" />//引用资源文件
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

上面这种样式局限性较多,实现的效果也较少。

 

转载于:https://my.oschina.net/u/3661223/blog/1538116

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值