Visualbrush binding in a style System.Windows.Data Error: 2

Visualbrush binding in a style System.Windows.Data Error: 2

我只有一个简单的绑定,它运行良好,但有一个错误弹出窗口。

效果有效,但仍然出错。

错误是 System.Windows.Data错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:(无路径);数据项=空;目标元素是 'VisualBrush' (HashCode=23487194);目标 属性 是 'Visual'(类型 'Visual')

我试过 x: Reference 但是会出现另一个错误。

如有帮助,不胜感激。

<Style TargetType="{x:Type Window}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Grid>
                            <Border 
                           x:Name="RoundMask"
                           CornerRadius="10"
                           Background="white"/>

                            <!-- The main content -->
                            <Grid>
                                <Grid.OpacityMask>
                                    <VisualBrush Visual="{Binding ElementName=RoundMask}" />
                                </Grid.OpacityMask>
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

像这样重新模板化 window 并不是我处理这类事情的真正方式。

我会使用更类似于此示例中的方法:

https://gallery.technet.microsoft.com/ThWPFPolishing-Chrome-f41be7fe

看完了window就是

Window6,使用资源字典 Dictionary1 中的 WindowChrome 样式。

其中有一个大的圆形关闭按钮。但在下载之前给你一个想法:

<Style x:Key="FinishedWindow" TargetType="{x:Type Window}">
    <Setter Property="FontFamily" Value="Comic Sans MS"/>
    <Setter Property="Foreground" Value="{StaticResource DarkDark}"/>
    <Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome CaptionHeight="0"
                          CornerRadius="20"
                          GlassFrameThickness="0"
                          NonClientFrameEdges="None"
                          ResizeBorderThickness="5"
                                    />
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Grid>
                    <Border   Background="{StaticResource BrightMid}"   BorderBrush="{StaticResource DarkLight}" BorderThickness="4,4,6,6" 
                         CornerRadius="12">
                        <Border.Effect>
                            <BlurEffect  KernelType="Gaussian" Radius="12" RenderingBias="Quality" />
                        </Border.Effect>
                    </Border>
                    <Border BorderBrush="{StaticResource DarkDark}" BorderThickness="2" 
                            CornerRadius="12" ClipToBounds="True">
                    </Border>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="32"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
                                          Foreground="{StaticResource DarkDark}"
                                          Grid.Row="0"
                                          HorizontalAlignment="Center" 
                                          VerticalAlignment="Bottom"
                                          FontWeight="Bold"
                                          FontSize="16"
                                     />
                        <Button Name="CloseButton" 
                                Width="20" Height="20"   
                                Grid.Row="0"
                                HorizontalAlignment="Right"
                                BorderThickness="0"
                                Margin="0,12,12,0"
                                Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=CloseCommand}"
                                Style="{StaticResource CloseButton}"/>
                        <ContentPresenter Grid.Row="1" Margin="12"/>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter> 

我试试你的风格。

只是隐式使用它根本没有效果。

我把它放在app.xaml里面给了它一个key

<Application.Resources>
    <Style TargetType="{x:Type Window}" x:Key="roundedWindowStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Grid>
                        <Border 
                       x:Name="RoundMask"
                       CornerRadius="10"
                       Background="white"/>

                        <!-- The main content -->
                        <Grid>
                            <Grid.OpacityMask>
                                <VisualBrush Visual="{Binding ElementName=RoundMask}" />
                            </Grid.OpacityMask>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

然后我将其应用到 mainwindow

<Window
    ...
    Title="MainWindow" 

    Style="{StaticResource roundedWindowStyle}"

按 f5... 就可以了。嗯。

如果你忽略 window chrome 意味着它不能像你想要的那样工作。

您可能应该考虑使用 window chrome。

有了你那里的东西。

至少,您需要在该网格内有一个 Contentpresenter。 因为 window 是一个内容控件,但如果您在模板中没有 contentpresenter,它根本不会显示任何内容。