none
Serialisierung von Triggern zur Designzeit RRS feed

  • Frage

  • Ist es möglich, ein ControlTemplate mit Trigger zur Designzeit mit XamlWriter.Save zu serialisieren? Zur Designzeit wird anstelle des  Triggers nur

            <Trigger.Value>
              <x:Null />
            </Trigger.Value>

    ausgegeben, während zur Laufzeit die Trigger vollständing serialisiert werden. Hier ist ein Beispielprogramm, das diesen Effekt zur Laufzeit und zur Designzeit demonstriert.

    <Window x:Class="TriggerSerialisierung.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TriggerSerialisierung"
        Title="MainWindow" Height="350" Width="525" >
      <Window.Resources>
        <ControlTemplate x:Key="BorderTemplate" TargetType="local:MyButton">
          <Border Name="Border" 
            BorderThickness="1" BorderBrush="Black">
            <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></ContentPresenter>
          </Border>
          <ControlTemplate.Triggers>
            <Trigger Property="Button.IsMouseOver" Value="True">
              <Setter TargetName="Border" Property="BorderThickness" Value="2"></Setter>
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
        <Style TargetType="local:MyButton">
          <Setter Property="Template" Value="{StaticResource BorderTemplate}"></Setter>
        </Style>
    
      </Window.Resources>
      <Grid>
        <local:MyButton HorizontalAlignment="Stretch" x:Name="button1" VerticalAlignment="Stretch" />
      </Grid>
    </Window>
    
      public class MyButton : Button
      {
        public MyButton()
        {
          this.Loaded += new RoutedEventHandler(MyButton_Loaded);
        }
    
        void MyButton_Loaded(object sender, RoutedEventArgs e)
        {
          MyButton b = (MyButton)sender;
          b.Content = this.XAMLstring(b.Template);
        }
        private string XAMLstring(object value)
        {
          StringBuilder xamlstring = new StringBuilder();
          XmlWriterSettings settings = new XmlWriterSettings();
          settings.Indent = true;
          settings.OmitXmlDeclaration = true;
          XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(XmlWriter.Create(xamlstring, settings));
          dsm.XamlWriterMode = XamlWriterMode.Expression;
    
          XamlWriter.Save(value, dsm);
    
          return xamlstring.ToString();
    
        }
    
      }
    

    Samstag, 28. August 2010 11:23

Antworten

  • Hallo Leonard,

    Ich hätte jetzt im ersten Moment an [DesignerProperties.SetIsInDesignMode(this, false)]  (->Vortäuschung) gedacht, ...
    aber das geht IMHO nicht.

    Insofern kann ich mir gerade nur den Weg über eine InMemory (WPF) Assembly, in die Du MyButton einbettest, Loaded abonniesrt und dann das XAML halt zum Beispiel über eine Methode zurückgibst. Wichtige Teile für den Start-Code für die Assembly kann man sich ja aus dem obj-Verzeichnis der cs-Dateien herauslesen/abschauen. Ich weiß, wenn man es noch nie gemacht hat, natürlich etwas aufwändig.

     


    ciao Frank
    Sonntag, 29. August 2010 19:17