Привязка Visualbrush в стиле System.Windows.Data Ошибка: 2 - PullRequest
0 голосов
/ 09 марта 2019

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

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

И ошибка System.Windows.Data Error: 2: Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.BindingExpression: (без пути);DataItem = NULL;целевым элементом является 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>

1 Ответ

0 голосов
/ 09 марта 2019

Повторное создание шаблона для такого окна - не совсем то, чем я бы хотел заниматься.

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

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

Готовое причудливое окно - enter image description here

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

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

<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 и дал ему ключ

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

И затем применил это к главному окну

<Window
    ...
    Title="MainWindow" 

    Style="{StaticResource roundedWindowStyle}"

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

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

enter image description here

Вы, вероятно, должны бытьвместо этого рассмотрим использование окна Chrome.

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

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

...