2015-09-28 12 views
7

Zanim odpowiesz, spójrz na this post.Jak powiązać z wartością pustą wewnątrz szablonu w Universal Windows App?

Uzyskanie odpowiedzi na to pytanie może rozwiązać problem poniżej.


Jest to problem, który zaczął się w systemie Windows 10 (aplikacje uniwersalne). W Windows 8.1 i każdej innej technologii XAML ta technika działała bez zarzutu. Oto konfiguracja w pustym uniwersalnej aplikacji projektu:

1. Statyczne klasy z dołączonym Własności

utworzyć klasę, która mieści załączony właściwość typu Brush. Umieść to w dowolnym miejscu w projekcie.

public static class MySettings 
{ 
    public static Brush GetAccentBrush(DependencyObject d) 
    { 
     return (Brush)d.GetValue(AccentBrushProperty); 
    } 

    public static void SetAccentBrush(DependencyObject d, Brush value) 
    { 
     d.SetValue(AccentBrushProperty, value); 
    } 

    public static readonly DependencyProperty AccentBrushProperty = DependencyProperty.RegisterAttached(
     "AccentBrush", 
     typeof(Brush), 
     typeof(MySettings), 
     null 
     ); 
} 

2. Dodaj formant do MainPage.xaml użyciu dołączonego właściwość

Na stronie głównej, dodać ContentControl z szablonu niestandardowego, który ma Grid z jego kolor tła ustawiony na akcent szczotka. Pędzel akcentowy jest ustawiony w stylu.

<Page x:Class="UniversalTest.MainPage" 
     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:local="using:UniversalTest" 
     mc:Ignorable="d"> 
    <Page.Resources> 
     <Style x:Key="MyControl" 
       TargetType="ContentControl"> 
      <Setter Property="local:MySettings.AccentBrush" 
        Value="Green" /> <!-- Setting value here --> 
     </Style> 
    </Page.Resources> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 

     <ContentControl Style="{StaticResource MyControl}"> 
      <ContentControl.Template> 
       <ControlTemplate TargetType="ContentControl"> 
        <Grid Background="{TemplateBinding local:MySettings.AccentBrush}"> <!-- Using value here --> 
         <TextBlock Text="Howdy World!" /> 
        </Grid> 
       </ControlTemplate> 
      </ContentControl.Template> 
     </ContentControl> 

    </Grid> 
</Page> 

Jeśli teraz uruchomisz aplikację, pojawi się ona na zielonym tle. Wszystko działa poprawnie. Jeśli jednak ustawisz wartość jako {x:Null}, zgłasza wyjątek.

<Page.Resources> 
    <Style x:Key="MyControl" 
      TargetType="ContentControl"> 
     <Setter Property="local:MySettings.AccentBrush" 
       Value="{x:Null}" /> <!-- Null value here --> 
    </Style> 
</Page.Resources> 

Czy ktoś chciałby zrobić zdjęcie?

+0

Jak o próbie 'Brush?' Zamiast 'Brush' . –

+0

'Pędzel' jest klasą. 'Nullable ' odnosi się tylko do struktur. – Laith

+0

Dlaczego chcesz ustawić wartość jako null? – Lance

Odpowiedz

2

Dla przypomnienia problem ten został naprawiony. Mój projekt odwołuje się do Universal Windows version 10.0.10240.0. Ustawienie pędzla na {x: Zero} zgodnie z opisem oryginalnego plakatu działa zgodnie z oczekiwaniami.

0

Możesz dodać fałszywy załączony właściwość:

public static Brush GetNullAccentBrush(DependencyObject d) 
    { 
     return (Brush)d.GetValue(NullAccentBrushProperty); 
    } 

    public static void SetNullAccentBrush(DependencyObject d, Brush value) 
    { 
     d.SetValue(NullAccentBrushProperty, value); 
    } 

    public static readonly DependencyProperty NullAccentBrushProperty = DependencyProperty.RegisterAttached(
     "NullAccentBrush", 
     typeof(SolidColorBrush), 
     typeof(MySettings), 
     null 
     ); 

i wiążą swoją setter nieruchomości:

<Setter Property="local:MySettings.AccentBrush" 
     Value="{Binding local:MySettings.NullAccentBrush}" /> 

Siatka Tło jest null (nawet jeśli nie jest wiążąca NullAccentBrush prawdziwe ...).

0

Odkryłem, że ten kod działa, w pliku zasobów

<Color x:Key="BgNull"></Color> 

następnie w użytku styl, który odwołuje się do BgNull

<Setter Property="Background" Value="{StaticResource BgNull}"/>