# Eigenschaft eines WPF UserControls im Editor anzeigen



## Marc_Quark (21 September 2010)

Hallo zusammen,

Zuerst muss ich sagen, dass ich noch nicht allzuviel Erfahrung mit WPF habe.
Mein Problem: 
Ich habe mir selbst ein WPF-UserControl erstellt und dazu eine Eigenschaft implementiert.

Zuerst habe ich es gemacht, wie ich es von Windows Forms gewohnt war:


```
[Description("Darstellung des Ventils: \ntrue=Vertikal false=Horizontal")]
        public bool Ausrichtung                       //Ausrichtung des Ventils bestimmen
        {
            get { return a1; }
            set { a1 = value;
            if (a1)
                pict_Ventil.Image = Image.FromFile(
                Application.StartupPath
                + @"\Bmp\Ventile\Ventil_Ver_Anwahl.bmp");
            else
                pict_Ventil.Image = Image.FromFile(
                 Application.StartupPath
                 + @"\Bmp\Ventile\Ventil_Hor_Anwahl.bmp");
            }
        }
```
 
Nach etwas suchen bin ich auf die Sache mit der DependencyProperty gestoßen...
Die Eigenschaft sieht nun folgendermaßen aus, jedoch wird Die Eigenschaft im Editor immer noch nicht angezeit.


```
...
public static readonly DependencyProperty a1 =
            DependencyProperty.Register("Ausrichtung", typeof(bool), typeof(Ventil));
[Description("Darstellung des Ventils: \ntrue=Vertikal false=Horizontal")]
        public bool Ausrichtung                       //Ausrichtung des Ventils bestimmen
        {
            get { return a1; }
            set { a1 = value;
            if (a1)
                pict_Ventil.Image = Image.FromFile(
                Application.StartupPath
                + @"\Bmp\Ventile\Ventil_Ver_Anwahl.bmp");
            else
                pict_Ventil.Image = Image.FromFile(
                 Application.StartupPath
                 + @"\Bmp\Ventile\Ventil_Hor_Anwahl.bmp");
            }
        }
...
```
 
Nach ewiger "erfolgloser" Suche hoff ich nun, dass mir hier jemand weiterhelfen kann...

Vielen Dank im vorraus


----------



## Verpolt (21 September 2010)

Hallo,

Nicht ganz meine Ecke, aber 

If .....

Then  <--- fehlt doch, oder ?


Else....


----------



## Marc_Quark (21 September 2010)

Sorry, vergessen zu erwähnen das ich in C# Programmiere...
Da kann man einzeige Anweisungen direkt unter das if setzen. Bei mehrzeiligen braucht man 
if...
{
...
...
}

"Then" ist ja VB und fällt bei C# weg


----------



## naturoptimist (22 September 2010)

Versuch es mal damit...


c# Code
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;
using System.ComponentModel;
namespace Nutz
{
 /// <summary>
 /// Interaction logic for iCVentil.xaml
 /// </summary>
 public partial class iCVentil : UserControl
 {
  public iCVentil()
  {
   this.InitializeComponent();
   SetVentilTyp();
  }
  //---------------------------------------------------------
  //Event für die Ventile
  private void Vr_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  {
   if( iCMouse == true)
    iCActCondition = !iCActCondition;
  }
  private void Ho_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  {

   if( iCMouse == true)   
       iCActCondition = !iCActCondition;
  }
  private void Vl_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  {
   if( iCMouse == true)
    iCActCondition = !iCActCondition;
  }
  private void Hu_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  {
   if( iCMouse == true)
    iCActCondition = !iCActCondition;
  }

  //---------------------------------------------------------
  //Alle Notwendigen Ventiltypen
  //---------------------------------------------------------
  private void SetVentilTyp()
  {
   Brush  CurrentBrush;

   Ho.Visibility = Visibility.Hidden;
   Hu.Visibility = Visibility.Hidden;

   Vr.Visibility = Visibility.Hidden;
   Vl.Visibility = Visibility.Hidden;


            if (iCActCondition == false)
            {
                CurrentBrush = iCColorClose;
            }
            else
            {
                CurrentBrush = iCColorOpen;
            }

   switch((int)iCVentilTyp)
   {
    //Einweg Horizontal
    case 0: Ho.Visibility = Visibility.Visible;
               Hu.Visibility = Visibility.Visible;
      Hu.Fill = CurrentBrush;
      Ho.Fill = CurrentBrush;

      break;

    //Einweg Vertical
    case 1: Vr.Visibility = Visibility.Visible;
               Vl.Visibility = Visibility.Visible;
      Vr.Fill = CurrentBrush;
      Vl.Fill = CurrentBrush;

      break;

    //Rechts / Oben
    case 2: Vr.Visibility = Visibility.Visible;
               Ho.Visibility = Visibility.Visible;
      Vr.Fill = CurrentBrush;
      Ho.Fill = CurrentBrush;

         break; 

    //Rechts / Unten
    case 3: Vr.Visibility = Visibility.Visible;
               Hu.Visibility = Visibility.Visible;
      Vr.Fill = CurrentBrush;
      Hu.Fill = CurrentBrush;

         break; 

    //Links / Unten
    case 4: Vl.Visibility = Visibility.Visible;
               Hu.Visibility = Visibility.Visible;
      Vl.Fill = CurrentBrush;
      Hu.Fill = CurrentBrush;

         break; 

     //Rechts / Unten
    case 5: Vr.Visibility = Visibility.Visible;
               Hu.Visibility = Visibility.Visible;
         Vr.Fill = CurrentBrush;
      Hu.Fill = CurrentBrush;
      break; 

       //Rechts / Unten
    case 6: Vr.Visibility = Visibility.Visible;
               Hu.Visibility = Visibility.Visible;
         Vl.Visibility = Visibility.Visible;
         Vr.Fill = CurrentBrush;
      Vl.Fill = CurrentBrush;
      Hu.Fill = CurrentBrush;
         break; 
   }
  } 


   private static void MyVentilCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
         {
             iCVentil iCX = d as iCVentil;
             iCX.SetVentilTyp();
         }



  //------------------------------------------------------
  //MouseBedienung
  //-------------------------------------------------------
       [Category("iCControlParameter")]
  public bool iCMouse
        {
            get{return (bool)GetValue(iCMouseProperty);}
            set{SetValue(iCMouseProperty, value);}
        }

   public static readonly DependencyProperty iCMouseProperty =
   DependencyProperty.Register("iCMouse", typeof(bool), typeof(iCVentil), new UIPropertyMetadata(true,  new PropertyChangedCallback(MyVentilCallback)));


 //------------------------------------------------------
 //Condition On/Off 0 -5
 //-------------------------------------------------------
       [Category("iCControlParameter")]
  public bool iCActCondition
        {
            get{return (bool)GetValue(iCActConditionProperty);}
            set{SetValue(iCActConditionProperty, value);}
        }

   public static readonly DependencyProperty iCActConditionProperty =
   DependencyProperty.Register("iCActCondition", typeof(bool), typeof(iCVentil), new UIPropertyMetadata(false,  new PropertyChangedCallback(MyVentilCallback)));


  //------------------------------------------------------
  //Ventiltyp 0 -5
  //-------------------------------------------------------
       [Category("iCControlParameter")]
  public double iCVentilTyp
        {
            get{return (double)GetValue(iCVentilTypProperty);}
            set{SetValue(iCVentilTypProperty, value);}
        }

   public static readonly DependencyProperty iCVentilTypProperty =
   DependencyProperty.Register("iCVentilTyp", typeof(double), typeof(iCVentil), new UIPropertyMetadata(0.0,  new PropertyChangedCallback(MyVentilCallback)));


 //------------------------------------------------------
 //Farbe Zustand close
 //-------------------------------------------------------
 [Category("iCControlParameter")]
        public Brush iCColorClose
        {
            get {return (Brush)GetValue(iCColorCloseProperty);}
            set {SetValue(iCColorCloseProperty, value);}
        }
        public static readonly DependencyProperty iCColorCloseProperty =
           DependencyProperty.Register("iCColorClose", typeof(Brush), typeof(iCVentil), new UIPropertyMetadata(Brushes.Red, new PropertyChangedCallback(MyVentilCallback)));

  //------------------------------------------------------
  //Farbe Zustand open
  //-------------------------------------------------------

     [Category("iCControlParameter")]
        public Brush iCColorOpen
        {
            get {return (Brush)GetValue(iCColorOpenProperty);}
            set {SetValue(iCColorOpenProperty, value);}
        }
        public static readonly DependencyProperty iCColorOpenProperty =
           DependencyProperty.Register("iCColorOpen", typeof(Brush), typeof(iCVentil), new UIPropertyMetadata(Brushes.Green, new PropertyChangedCallback(MyVentilCallback)));



 }
}



XAML Code....Da sind die Ventile drin

<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"
 mc:Ignorable="d"
 x:Class="Nutz.iCVentil"
 x:Name="UserControl" Height="80" Width="79.667">
   <Viewbox  Stretch="Fill" >
  <Grid x:Name="MyGrid" Height="80.333" Width="80">
   <Path x:Name="Vl" Fill="#FFE01616" Stretch="Fill" Stroke="Black" Margin="0.167,20.081,39.342,19.759" Data="M39.5,39.5 L39.5,79.5 79.5,59.166667 z" MouseLeftButtonDown="Vl_MouseLeftButtonDown"/>
   <Path x:Name="Vr" Fill="#FFE01616" Stretch="Fill" Stroke="Black" HorizontalAlignment="Right" Margin="0,19.587,0.333,20.253" Width="39.503" Data="M39.5,39.5 L39.5,79.5 79.5,59.166667 z" RenderTransformOrigin="0.5,0.5" MouseLeftButtonDown="Vr_MouseLeftButtonDown">
    <Path.RenderTransform>
     <TransformGroup>
      <ScaleTransform ScaleX="-1"/>
      <SkewTransform/>
      <RotateTransform/>
      <TranslateTransform/>
     </TransformGroup>
    </Path.RenderTransform>
   </Path>
   <Path x:Name="Hu" Fill="#FFE01616" Stretch="Fill" Stroke="Black" Margin="20.602,40.082,19.32,-0.094" Data="M38.902941,39.650301 L39.5,79.5 79.5,59.166667 z" RenderTransformOrigin="0.5,0.5" MouseLeftButtonDown="Hu_MouseLeftButtonDown">
    <Path.RenderTransform>
     <TransformGroup>
      <ScaleTransform ScaleX="-1.0000673962837654" ScaleY="0.99993260825818753"/>
      <SkewTransform AngleY="0.00012859966321343563"/>
      <RotateTransform Angle="89.045935698002282"/>
      <TranslateTransform X="-0.21830202583907976" Y="-0.214711602900735"/>
     </TransformGroup>
    </Path.RenderTransform>
   </Path>
   <Path x:Name="Ho" Fill="#FFE01616" Stretch="Fill" Stroke="Black" Margin="21.081,-1.076,18.672,0" Data="M39.5,39.5 L38.726389,79.004427 79.5,59.166667 z" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Top" Height="40.004" MouseLeftButtonDown="Ho_MouseLeftButtonDown">
    <Path.RenderTransform>
     <TransformGroup>
      <ScaleTransform ScaleX="-1.0000674038794131" ScaleY="0.99993260066356382"/>
      <SkewTransform AngleY="-9.908580004491796E-05"/>
      <RotateTransform Angle="-89.264950455430608"/>
      <TranslateTransform X="-0.62123535044228007" Y="0.61335806666287951"/>
     </TransformGroup>
    </Path.RenderTransform>
   </Path>
   <Ellipse Fill="#FF080812" Margin="35.158,34.938,34.467,34.771" Stroke="Black"/>
  </Grid>

 </Viewbox>

</UserControl>


----------



## Marc_Quark (22 September 2010)

Problem gelöst, falls es jemanden interessiert 

Der Fehler lag darin, dass ich eine "WPF-Benutzersteuerelementbibliothek"
erstellt habe. Um es richtig zu machen muss man eine 
"Benutzerdefinierte WPF-Benutzersteuerelementbibliothek" erstellen,
welche ansich gleich aussieht aber nicht so ist...*ACK*

Grüße


----------



## david.ka (22 September 2010)

Hallo,

ich denke der Fehler lag nicht darin.
Die Dep.Props. kannst du auf beiden Controls erstellen, und "von extern" darauf zugreifen.


```
<Window x:Class="WPF_Test_Control.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myCL="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1"
    xmlns:myCCL="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <myCL:UserControl1 x:Name="UserControl1" MyProperty="1"></myCL:UserControl1>
        <myCCL:CustomControl1 x:Name="CustomUserControl1" MyProperty="1" ></myCCL:CustomControl1>
        
    </Grid>
</Window>
```

Obiger Quellcode:
Ich habe ein UserControl (WPF-Benutzersteuerelementbibliothek) und ein CustomUserControl (Benutzerdefinierte WPF-Benutzersteuerelementbibliothek) erstellt und in eine Windows-WPF Anwendung eingefügt. Beide haben die Dep. Prop. MyProperty (int). Auf beide kann zugegriffen werden. Diese werden auch im Designer angezeigt.

Bei den beiden von dir erwähnten Controls handelt es sich um zwei grundverschiedene Arten von Controls.

Viele Grüße
David


----------



## Marc_Quark (23 September 2010)

Danke für die Antwort David,

find es nur komisch das bei mir die Projekte mit gleichem Quellcode nur beim CustomUserControl richtig fuktionierten... Für mich ist erstmal die Hauptsache das es funktioniert, wenn ich mal wieder etwas mehr Zeit habe werde ich mich genauer damit befassen...

Grüsse


----------



## david.ka (23 September 2010)

Hallo Marc_Quark,
bitte. 
Du musst nur brachten, dann du bei deinem Control "selber zeichnen musst".
die andere Art ist quasi ein Container, in das du beliebige Controls per drag&drop einfügen kannst....


----------

