Привязка Visualbrush в стиле System.Windows.Data Ошибка: 2

У меня просто есть простая привязка, она работает хорошо, но появляется всплывающее окно с ошибкой.

Эффекты работают, но все равно ошибка.

И ошибка: System.Windows.Data Error: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: (без пути); Элемент данных = ноль; целевой элемент — «VisualBrush» (HashCode=23487194); целевое свойство — «Визуальный» (тип «Визуальный»)

Я пробовал 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>

person Will Zhang    schedule 09.03.2019    source источник


Ответы (1)


Повторное создание такого окна - это не совсем то, как я бы поступил в таких вещах.

Я бы использовал что-то более похожее на подход в этом примере:

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

Готовое причудливое окно: введите здесь описание изображения

Window6, используя стиль WindowChrome, который находится в словаре ресурсов Dictionary1.

У которого есть что-то вроде большой круглой кнопки закрытия. Но чтобы дать вам представление перед загрузкой:

<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> 

I gave your style a go.

Простое использование его неявно не имело никакого эффекта.

Я поместил его в app.xaml и дал ему ключ

<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>

And then I applied that to mainwindow

<Window
    ...
    Title="MainWindow" 

    Style="{StaticResource roundedWindowStyle}"

Нажмите f5... и вроде работает. Хорошо.

Если вы проигнорируете этот хром окна, это означает, что оно не может работать так, как вы, кажется, намереваетесь.

введите здесь описание изображения

Вместо этого вам, вероятно, следует взглянуть на использование оконного хрома.

С тем, что у вас есть.

Как минимум, вам нужен Contentpresenter внутри этой сетки. Потому что окно — это элемент управления содержимым, но оно вообще не будет отображать содержимое, если в шаблоне нет презентатора содержимого.

person Andy    schedule 09.03.2019
comment
Привет, спасибо за ответ, но на самом деле это не проблема, с которой я столкнулся, я не включил часть контента и часть хрома, но проблема вызвана VisualBrush, так как использование визуальной привязки кисти в стиле вызвать исключение. - person Will Zhang; 09.03.2019
comment
Видите вторую картинку? Использование визуальной привязки кисти в стиле. Никаких исключений. - person Andy; 09.03.2019
comment
Привет, Энди, большое спасибо, я думаю, что знаю, почему это произошло. Это потому, что я упаковал этот стиль в dll. Если я помещу его в app.xaml, он будет работать хорошо. Но поскольку это окно сообщений, я все же хочу поместить его в dll для ссылки. - person Will Zhang; 10.03.2019
comment
И когда окно внутри dll ссылается на этот стиль, это вызовет эту ошибку, но другое обычное окно может использовать это свободно. - person Will Zhang; 10.03.2019