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="&#xE72B;" 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="&#xE712;" 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实现自定义窗口功能的一种方法。

WPF WindowChrome ContentPresenter 不显示内容

C# WPF通过WindowChrome自定义窗体

WPF 无边框拖动