Привязка Visualbrush в системе стилей.Windows.Ошибка данных: 2

#c# #wpf #xaml #binding #visualbrush

#c# #wpf #xaml #привязка #visualbrush

Вопрос:

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

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

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

Ответ №1:

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

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

https://gallery.technet.microsoft.com/ThWPFPolishing-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> 
  

Я попробовал ваш стиль.

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

Я поместил это в 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>
  

А затем я применил это к mainwindow

 <Window
    ...
    Title="MainWindow" 

    Style="{StaticResource roundedWindowStyle}"
  

Нажмите f5 … и это вроде как работает. Что ж.

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

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

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

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

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

Комментарии:

1. Привет, спасибо за ответ, но на самом деле это не та проблема, с которой я сталкиваюсь, я не включил часть содержимого и часть chrome, но проблема вызвана VisualBrush, поскольку использование привязки visual brush в стиле вызовет исключение.

2. Видите вторую картинку? Использование привязки visual brush в стиле. Никаких исключений.

3. Привет, Энди, большое тебе спасибо, я думаю, я знаю, почему это произошло. Это потому, что я упаковал этот стиль в dll,. Если я помещу это в app.xaml, это будет хорошо работать. Но поскольку это messagebox, я все равно хочу поместить его в dll для ссылки.

4. И когда окно внутри библиотеки dll ссылается на этот стиль, это вызовет эту ошибку, но другое обычное окно может свободно использовать это.