WPF WindowChrome ContentPresenter 不显示内容
Posted
技术标签:
【中文标题】WPF WindowChrome ContentPresenter 不显示内容【英文标题】:WPF WindowChrome ContentPresenter does not display content 【发布时间】:2020-11-04 11:25:39 【问题描述】:当我尝试显示来自ContentPresenter
的内容时,我什么也看不到。测试块不显示任何文字,似乎被隐藏了。
<local:ResizableVideoHostWindow x:Class="TestClass"
x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
mc:Ignorable="d"
Title="Binding Title">
<Window.Style>
<Style TargetType="x:Type local:ResizableVideoHostWindow">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome
CaptionHeight="30"
CornerRadius="1"
GlassFrameThickness="0,0,0,-1"
NonClientFrameEdges="None"
ResizeBorderThickness="5"
UseAeroCaptionButtons="true"/>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ResizableVideoHostWindow">
<Grid x:Name="AppTitleBar" Background="Transparent" VerticalAlignment="Top">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
<Button
Background="Transparent"
Visibility="Visible"
BorderThickness="0"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Width="20"
Height="20"
Margin="8,2,0,0"
shell:WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets">
</TextBlock>
</Button>
<TextBlock
FontFamily="Segoe UI"
Grid.Column="1"
Height="20"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextAlignment="Center"
Margin="35,4,0,0"
Text="Binding RelativeSource=RelativeSource TemplatedParent, Path=Title" />
<Button
Background="Transparent"
Visibility="Visible"
BorderThickness="0"
Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Margin="0,0,160,0"
Width="30"
Height="30"
shell:WindowChrome.IsHitTestVisibleInChrome="True">
<TextBlock Text="" FontFamily="Segoe MDL2 Assets">
</TextBlock>
</Button>
<ContentPresenter Grid.Row="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="WindowState" Value="Maximized">
<Setter Property="BorderThickness" Value="7" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Style>
<Grid Visibility="Visible">
<TextBlock Text="Test Block" FontSize="20" >
</TextBlock>
<local:AppProxyContainer
DataContext="Binding ContainerViewModel" />
</Grid>
</local:ResizableVideoHostWindow>
我主要对如何显示内容感到困惑。我看到其他帖子说这种使用ContentPresenter
的方法有效,但它不适用于我。
【问题讨论】:
【参考方案1】:你正确使用了ContentPresenter
,但是你没有在Grid
中设置它的列,所以它将被放在LeftPaddingColumn
列中,Width
为零。
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
将其附加的Grid.Column
属性设置为1
,因此它将显示在第二列中,该列的大小与剩余空间相同。
<ContentPresenter Grid.Row="1" Grid.Column="1"/>
【讨论】:
以上是关于WPF WindowChrome ContentPresenter 不显示内容的主要内容,如果未能解决你的问题,请参考以下文章
WPF中使用WindowChrome自定义窗口中遇到的最大化问题
[WPF自定义控件库]使用WindowChrome自定义RibbonWindow
WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。