.NET GUI

.NET Community rund um alle Graphical User Interface (GUI) Themen.
Willkommen bei .NET GUI. Anmeldung | Registrieren | Hilfe | Impressum | Forumsregeln
in Suchen

Elliptischer Button mit Databinding

Letzter Beitrag 07-16-2008 10:03 von Norbert Eder. 12 Antworten.
Seite 1 von 1 (13 Treffer)
Beiträge sortieren: Zurück Weiter
  • 07-15-2008 8:53

    • knatterton
    • Top 10 Mitwirkender
    • Registriert am 07-09-2008
    • Beiträge 33
    • Punkte 630

    Elliptischer Button mit Databinding

    Ich probiere gerade einen Elliptischen Button mit einem Datatemplate zu schreiben. Das Problem ist, dass ich die Daten nicht in den Button bekomme. Ich lege ein ControlTemplate für den Button an damit er seine elliptische Form bekommt. Einen Text und ein Bild soll er auch anzeigen. Beim Klicken auf den Button sollen die Daten angezeigt werden. Hier ist der Code dazu. Was mache ich falsch? Das Verändern der Größe funktioniert. Da der Button ja auch ein Contentproperty hat kann man auch ein Datatemplate verwenden. Damit kann ich aber den Button nicht elliptisch aussehen lassen. Würde mich sehr über eine Antwort freuen.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    private void btn_Click(object sender, RoutedEventArgs e)
    {
    try
    {
    ImageSource mySource = FindResource("close") as ImageSource;
    btn.Content = new ButtonContent("halllo", mySource);
    btn.Width = 200;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    namespace ControlTemplateTest
    {
    class ButtonContent
    {
    public ButtonContent(string text, ImageSource icon)
    {
    _text = text;
    _icon = icon;
    }
    public ButtonContent()
    { }
    private string _text;
    private ImageSource _icon;
    public string Text
    {
    get { return _text; }
    set { if (value != null) _text = value; }
    }
    public ImageSource Icon
    {
    get { return _icon; }
    set { if (value != null) _icon = value; }
    }
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <Window
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     x:Class="ControlTemplateTest.Window1"
     x:Name="Window"
     Title="Window1"
     Width="640" Height="480">
    
     <Grid x:Name="LayoutRoot">
      <Button HorizontalAlignment="Left" x:Name="btn" VerticalAlignment="Top" Content="Button" Click="btn_Click" Template="{DynamicResource ButtonControlTemplate1}"/>
     </Grid>
    </Window>
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     <!-- Resource dictionary entries should be defined here. -->
      <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}">
      <Grid>
       <Ellipse Fill="#FFFF9797" Stroke="#FF000000"/>
       <Label HorizontalAlignment="Left" VerticalAlignment="Center" Content="{Binding Path=Text, Mode=Default}"/>
       <Image Margin="0,0,25,0" Source="{Binding Path=Icon, Mode=Default}"/>
      </Grid>
     </ControlTemplate>
    </ResourceDictionary>
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    
    <ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     <!-- Resource dictionary entries should be defined here. -->
        <ImageSource x:Key="close">grafics\close.ico</ImageSource>
    </ResourceDictionary>
    
    

    Ich habe im Forum gesucht ob es Formatierungen für Code gibt. Habe ich nicht gefunden. Kann ich aber vielleicht anschließend editieren wenn ich es gefunden habe wie man es macht. In dem Artikel wie poste ich richtig oder in der Hilfe habe ich nichts gefunden.

    Danke für den Hinweis Smile. Habs geändert.

    Kombiniere...
    • Beitragspunkte: 50
    • IP-Adresse ist Registriert
  • 07-15-2008 10:30 Antwort zu

    • FantaMango77
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05-07-2008
    • Magdeburg, DE
    • Beiträge 90
    • Punkte 1.685
    • Moderator

    AW: Elliptischer Button mit Databinding


    knatterton:
    Ich habe im Forum gesucht ob es Formatierungen für Code gibt. Habe ich nicht gefunden. Kann ich aber vielleicht anschließend editieren wenn ich es gefunden habe wie man es macht. In dem Artikel wie poste ich richtig oder in der Hilfe habe ich nichts gefunden.


    Über der Textbox gibt es in der Toolbar einen Schalter "Insert Code Snippet". Den kannst du benutzen und formatierten Code einzubetten.

    Ciao,
    Jens
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 07-15-2008 10:54 Antwort zu

    • FantaMango77
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05-07-2008
    • Magdeburg, DE
    • Beiträge 90
    • Punkte 1.685
    • Moderator

    AW: Elliptischer Button mit Databinding


    Suche mal im Netz nach "wpf imagebutton". Da wirst du eine ganze Reihe von Beispielen finden, wie man so etwas umsetzt.

    Um den Text im Label zu setzen solltest du die TemplateBinding-Extension verwenden. Der Label-Code sieht dann so aus:

    <Label HorizontalAlignment="Left" VerticalAlignment="Center" Content="{TemplateBinding Content}"/>

    Um ein Image auf den Button zu bekommen, ist es einfacher eine von "Button" abgeleitete Klasse zu schreiben, die eine DependencyProperty besitzt:

    public class ImageButton : Button
    {
    public ImageSource Image
    {
    get { return base.GetValue(ImageProperty) as ImageSource; }
    set { base.SetValue(ImageProperty, value); }
    }
    public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton));
    }

    Damit kannst das Image im Xaml-Code

    <Image Margin="0,0,25,0" Source="{TemplateBinding Image}"/>

    und in C#-Code setzen:

    btn.Image = mySource;

    Ciao,
    Jens



    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 11:43 Antwort zu

    • Jacobs
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 05-21-2008
    • Köln
    • Beiträge 11
    • Punkte 185

    AW: Elliptischer Button mit Databinding

    Hi,

    lösch aus deinem Controltemplate einfach das Label und das Image und füge statt dessen einen Contentpresenter hinzu. Dieser bekommt dann automatisch den Inhalt den du über Button.Content hinzufügst.

    gruß grischa
    Microsoft Senior Student Partner
    Technische Universität Darmstadt
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 12:54 Antwort zu

    • FantaMango77
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05-07-2008
    • Magdeburg, DE
    • Beiträge 90
    • Punkte 1.685
    • Moderator

    AW: Elliptischer Button mit Databinding

    Hi Grischa,

    das hat dann aber den Nachteil, dass du für jeden Button, der ein Image enthalten soll, die Content-Eigenschaft vorgeben musst. Das Einzige, was sie von vornherein per Template gemeinsam haben, ist ihre Form.

    Ciao,
    Jens
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 07-15-2008 13:11 Antwort zu

    • knatterton
    • Top 10 Mitwirkender
    • Registriert am 07-09-2008
    • Beiträge 33
    • Punkte 630

    AW: Elliptischer Button mit Databinding

    Danke Smile 

    Mal angenommen ich habe aber schon einen Button in XAML definiert und möchte jetzt ein Databinding per CLR vornehmen. Muss ich den Button dann neu anlegen. In deinem Beispiel muss das Control mit dem DependencyProperty ja schon vor dem Design instanziert sein. Ist das wirklich der Weg den MS da gehen will?

    Kombiniere...
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 13:30 Antwort zu

    • FantaMango77
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05-07-2008
    • Magdeburg, DE
    • Beiträge 90
    • Punkte 1.685
    • Moderator

    AW: Elliptischer Button mit Databinding

    Ich verstehe nicht ganz, was du mit "Databinding per CLR" und "vor dem Design instanziert" meinst.

    Beschreibe doch einfach mal genauer, was du vorhast.

    Ciao,
    Jens
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 13:57 Antwort zu

    • knatterton
    • Top 10 Mitwirkender
    • Registriert am 07-09-2008
    • Beiträge 33
    • Punkte 630

    AW: Elliptischer Button mit Databinding

    Ok. Los gehts...

    Es ist so das in nächster Zeit ein großes Projekt ansteht. Das soll mit WPF umgesetzt werden. Es ist auch so, dass viele Leute an dem UI arbeiten werden. Bisher hatte ich mir das so vorgestellt, dass ein ganz kleiner Teil mit Expression Design gemacht wird. Alles das was man mit Blend nicht machen kann. Die Designer die keine Ahnung von C# haben sollten die Controls anlegen. Die Controls sollten aber auch schon richtig angelegt werden. D.h. man muss vorher wissen ob ich jetzt ein Datatemplate oder ein Controltemplate verwende. Die Unterschiede scheinen mir erstmal soweit klar zu sein. Dennoch verleitet XAML dazu Datatemplates anzulegen wo sie evtl. keinen Sinn ergeben. Zum Beispiel die Geschichte mit dem Button. Button hat ein Contentproperty. Über dieses wäre es möglich ein Datatemplate anzulgen. Wenn ich jetzt mit der CLR Klasse den Content füllen will geht das. Steht auch so in einigen Büchern beschrieben. Wie ich aber schon mitbekommen habe ist das wohl nicht der optimale Weg. Warum? Weil ich den Aufbau des Button nicht überschreiben kann. Dazu braucht man ein Controtemplate. Da funktioniert aber dann das Databinding nicht richtig. Jetzt ist es so, dass du mir eine Lösung gezeigt hast die bestimmt funktioniert. Habe noch keine Zeit gehabt es auszuprobieren aber beim Googlen bin ich auf den Artikel gestoßen. Nun ist es ja so, dass die Designer die maximal XAML editieren dann erstmal auf den Programmierer warten müssen damit er den abgeleiteten Button bekommt um ihn "schön" zu machen. Und da ist mein Problem. Ich habe von Microsoft gehört, dass man nur in sehr seltenen Fällen ein CustomControl anlegen muss.

    Was ich an der ganzen Sache nicht verstehe ist, dass man auf der einen Seite sagt man ist auf beiden Seiten (XAML und C#) offen. Das ist aber nur so wenn man vorher weiß wie man etwas umsetzen muss. Wenn man sich die Webcasts anschaut dann denkt man, dass alles ganz einfach ist. Bei dem Button... Da gibt es unzählige Beispiele wie man so ein Control elliptisch macht. Aber beim Databinding hört es dann auf einmal auf. Angenommen ich habe jetzt schon einen Haufen Controls in XAML mit Template und Styles angelegt. Die kann ich dann ja garnicht mehr benutzten wenn die Daten auf einmal per CLR bestückt werden sollen. Ich habe heute ein neues Buch bekommen. Mal sehen was da so drin steht. Aber über Antworten und Meinungen hierauf würd ich mich freuen.

    Kombiniere...
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 15:10 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 502
    • Punkte 7.469
    • ForumsAdministrator

    AW: Elliptischer Button mit Databinding

    Natürlich ist XAML und C# offen. Offen bedeutet in diesem Fall, dass es in alle Richtungen erweitert werden kann. Am Beispiel deines Buttons: Es kann natürlich ein Designer einen Button erstellen, der ein Image anzeigt, Texte und was weiß ich noch. Nun kannst du ein Template erstellen, welches für alle Buttons gilt, aber eben für alle das gleiche Image anzeigt. Das wirst du nicht wollen. Nun kannst du für jeden Button ein eigenes Template erzeugen und dem Button zuweisen, damit unterschiedliche Images angezeigt werden. Das wirst du auch nicht wollen. Also erstellst du einen abgeleiteten Button, der ein Image aufnehmen kann. Damit kommst du mit _einem_ Template für alle Buttons aus.

    Was die Zusammenarbeit mit Designern betrifft:
    Vor der Entwicklung werdet ihr wohl Anforderungen definiert haben. Aus diesen Anforderungen ist die Funktionalität abzuleiten und vermutlich auch das visuelle Endergebnis. Daraus wird klar, wo Erweiterungen notwendig sind und die einzelnen Arbeitspakete können damit in Abhängigkeit gebracht werden. Damit sollte es auch kaum Wartezeiten geben.
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 15:52 Antwort zu

    • knatterton
    • Top 10 Mitwirkender
    • Registriert am 07-09-2008
    • Beiträge 33
    • Punkte 630

    AW: Elliptischer Button mit Databinding

    Ich habe mal ein Beispiel gemacht wo ich in einer Listbox meine Button mit Text und Image untergebracht hatte. Da habe ich nur ein ItemControlTemplate erstellt und die Button hatten alle unterschiedlichen Content. Eine Listbox mit den gewünschten Button zu füllen scheint einfacher zu sein als die Button ohne die Listbox zu erstellen. Ich hatte gedacht wenn ich das mit der Listbox so geschafft habe, kann der einzelne Button nicht so schwer sein. Evtl. ist an meinem Konzept was falsch aber ich hatte es mir nur einfacher vorgestellt und auch gedacht, dass WPF da einen einheitlichen Weg einschlagen würde. Denn wenn ich ein ControlTemplate habe und dann im Anschluss da keine Daten binden kann find ich das recht unflexibel. Schade...
    Kombiniere...
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-15-2008 16:27 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 502
    • Punkte 7.469
    • ForumsAdministrator

    AW: Elliptischer Button mit Databinding

    Answer
    Das was dir nicht eingehen will:

    Das Binding wird bei der Definition des Buttons vorgenommen. Im ControlTemplate machst du nur mehr ein TemplateBinding auf Eigenschaften des Controls welches "getemplated" wird.

    Das wird im Beitrag Image in eigenem Button anzeigen auch gezeigt. Darauf hatte ich dich schon mal verwiesen :)

    Zusatz: WPF schlägt einen einheitlichen Weg diesbezüglich ein.
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-16-2008 9:31 Antwort zu

    • knatterton
    • Top 10 Mitwirkender
    • Registriert am 07-09-2008
    • Beiträge 33
    • Punkte 630

    AW: Elliptischer Button mit Databinding

    Vielen Dank für eure Antworten. Hat erstmal sehr weitergeholfen. Der Ablauf des Projektes wird sich jetzt wohl etwas ändern aber die Hauptsache ist, dass man jetzt auf dem richtigen Weg ist. Big Smile
    Kombiniere...
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 07-16-2008 10:03 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 502
    • Punkte 7.469
    • ForumsAdministrator

    AW: Elliptischer Button mit Databinding

    Schön. Bei weiteren Fragen (konzeptionell, umsetzungstechnisch etc.) kannst du dich ja gerne wieder melden :)
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
Seite 1 von 1 (13 Treffer)
Powered by Community Server (Commercial Edition)    Hosting powered by 69° media solutions