none
Style-Trigger-Property an eigene DependencyProperty setzen RRS feed

  • Frage

  • Guten Tag zusammen,

    ich versuche nun schon seit ein paar Stunden weiter an einem meiner eigenen Buttons zu arbeiten. Mein momentanes Ziel ist es dem Button eine Eigenschaft vom Typ bool zu geben.
    Später möchte ich dann über Style-Trigger auswerten, ob diese Eigenschaft true/false ist und entsprechend das Aussehen des Buttons anpassen.

    Die Eigenschaft soll "IsChecked" heißen und wird hinterher durch das LeftMouseButtonUp-Event umgeschaltet.

    Die ganze "Xaml, Trigger, Property" - Thematik ist mir noch ziemlich neu und verwirrt mich regelmäßig, deshalb entschuldigt bitte, wenn die nachfolgenden Codebeispiele nicht ganz optimal sind oder ich verschiedene Sachen durcheinander werfe.

    Hier erstmal meine LeftMenuBtn.xaml:

    <UserControl
    	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="clr-namespace:IFCSControls"
    	mc:Ignorable="d"
    	x:Class="IFCSControls.LeftMenuBtn"
    	x:Name="LeftMenuButton"
    	d:DesignWidth="640" d:DesignHeight="480" Width="152" Height="76">
    	<UserControl.Resources>
    		<LinearGradientBrush x:Key="NormalStateGradient" EndPoint="1.197,0.542" StartPoint="0.037,0.542">
    				<GradientStop Color="#FF4D4D4D" Offset="0.741"/>
    				<GradientStop Color="#29000000" Offset="1"/>
    		</LinearGradientBrush>
    		<LinearGradientBrush x:Key="DisabledStateGradient" EndPoint="1.197,0.542" StartPoint="0.037,0.542">
    				<GradientStop Color="#FFFF0000" Offset="0.741"/>
    				<GradientStop Color="#29000000" Offset="1"/>
    		</LinearGradientBrush>
    		<LinearGradientBrush x:Key="CheckedStateGradient"  EndPoint="1.197,0.542" StartPoint="0.037,0.542">
    				<GradientStop Color="#FFFF0000" Offset="0.741"/>
    				<GradientStop Color="#29000000" Offset="1"/>
    		</LinearGradientBrush>
    		
    		<Style x:Key="ButtonEnableStates" TargetType="{x:Type Grid}">
    			<Style.Triggers>
    				<Trigger Property="IsEnabled" Value="True">
    					<Setter Property="Background" Value="{DynamicResource NormalStateGradient}" />
    				</Trigger>
    				<Trigger Property="IsEnabled" Value="False">
    					<Setter Property="Background" Value="{DynamicResource DisabledStateGradient}" />
    				</Trigger>
    				<Trigger Property="local:LeftMenuBtn.IsChecked" Value="True">
    					<Setter Property="Background" Value="{DynamicResource CheckedStateGradient}" />
    				</Trigger>
    			</Style.Triggers>
    		</Style>
    	</UserControl.Resources>
    	
    	<Grid x:Name="LayoutRoot" Style="{DynamicResource ButtonEnableStates}" />
    </UserControl>

    Und noch die dazugehörige .cs Datei:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace IFCSControls
    {
    	/// <summary>
    	/// Interaction logic for LeftMenuBtn.xaml
    	/// </summary>
    	public partial class LeftMenuBtn : UserControl
    	{
    		public LeftMenuBtn()
    		{
    			this.InitializeComponent();
    		}
    		
    		public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(LeftMenuBtn));
    		
    		public bool IsChecked
    		{
                get { return (bool)GetValue(IsCheckedProperty); }
                set { SetValue(IsCheckedProperty, value); }
    		}
    	}
    }

    Nachdem ich mich schon durch Google/MSDN/Stackoverflow gegraben habe und mehrere Frageposts bei Stackoverflow eröffnet habe wurde mir gesagt, dass ich kein normales DependencyProperty nehmen könnte, um Grid diese neue Eigenschaft zu verpassen. 
    In meinem letzten Post bei Stackoverflow wurde geschrieben, dass der TargetType des Style's Grid ist und die Property für LeftMenuBtn definiert ist.
    Außerdem meinte der Beitragende, dass man in diesem Fall eine AttachedProperty für LeftMenuBtn nehmen muss und im Trigger 'local:LeftMenuBtn.IsChecked' einfügt.

    Also ich weiß momentan echt nicht mehr weiter und verliere immer mehr Zeit mit dem ganzen XAML Kram. Leider finde ich persönlich auch nichts passendes bei Google was mir weiterhilft.

    Ich hoffe, dass mir hier jemand weiterhelfen kann. Wie gesagt ist die ganze Thematik für mich sehr komplex und momentan ziemlich unverständlich, weil es einfach so viele Sachen gibt und man teilweise hin und her gerissen wird von den Thematiken, nur um ein Problem zu lösen.

    Ich bedanke mich trotzdem schonmal für alle Antworten im Vorraus! :)

    Sonntag, 9. September 2012 15:47

Antworten

  • Hi Skadier,

    das Problem ist, dass Du den Style auf dem im UserControl enthaltenen Grid setzt, aber die IsChecked-Property nachher ja nicht auf diesem Grid, sondern auf dem UserControl (LeftMenuBtn) gesetzt wird. Damit der Style des Grids die auf dem UserControl gesetzte Dependency-Property nimmt, kannst Du wie folgt einen DataTrigger verwenden:

    <Style x:Key="ButtonEnableStates" TargetType="{x:Type Grid}">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="True">
                <Setter Property="Background" Value="{DynamicResource NormalStateGradient}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="{DynamicResource DisabledStateGradient}" />
            </Trigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl},Path=IsChecked}" Value="True">
                <Setter Property="Background" Value="{DynamicResource CheckedStateGradient}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>


    Thomas Claudius Huber Twitter: @thomasclaudiush Homepage: www.thomasclaudiushuber.com Author of the ultimate Windows Store Apps handbook Author of the ultimate WPF handbook Author of the ultimate Silverlight handbook

    Donnerstag, 4. Juli 2013 17:41