Eigenschaft eines WPF UserControls im Editor anzeigen

Marc_Quark

Level-1
Beiträge
62
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Code:
            [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.

Code:
           ...
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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>
 
Problem gelöst, falls es jemanden interessiert :D

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

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

Code:
<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
 
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
 
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....
 
Zurück
Oben