UserControl Eigenschaft zur Laufzeit ändern

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ThomasSt.

    UserControl Eigenschaft zur Laufzeit ändern

    Folgendes uercontrol_tooltip1l ist Bestandteil eines Tooltip:

    XML-Quellcode

    1. <UserControl x:Class="usercontrol_tooltip1"
    2. x:Name="usercontrol_tltp1"
    3. <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
    4. <Image/>
    5. <Label x:FieldModifier="public" Content="Testeinstellungen"/>
    6. </StackPanel>
    7. </UserControl>


    XML-Quellcode

    1. <Border>
    2. <Image Name="cntrl_image" >
    3. <Image.ToolTip>
    4. <mycontrol:usercontrol_tooltip1/>
    5. </Image.ToolTip>
    6. </Image>
    7. </Border>


    Das Control wird im Fenster aufgerufen. Wie ändere ich zur Laufzeit, bei Aufruf von <Border>... die EIgenschaft von <usercontrol_tooltip1 content="ganz anderer Text"/>

    Es betrifft auch alle anderen EIgenschaften von UserControl. O.g. Aufgabe ist nur Exemplarisch.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ThomasSt“ ()

    Hallo und wilkommen im Forum.

    Als erstes, editiere bitte deinen CodeTag. Fett schreiben innerhalb von Code geht nicht. Jetzt liest es sich nicht wirklich toll.
    Achja, ich glaube irgendwie das du das falsche Label verwendet hast, es geht vermutlich um WPF nicht um WIndowsPhone 7 oder???

    Zu deinem Problem. Sowas sollte rein über Binding gemacht werden. Ich zeige dir zwei Möglichkeiten, empfehle dir die zweite, zeige dir jedoch trotzdem einen anderen (eleganteren) Weg.
    Es gibt zwei möglichkeiten dies zu bewerkstelligen.

    Möglichkeit 1:
    Erstellung eines DependencyProperty.

    Das DP im Code selbst:

    VB.NET-Quellcode

    1. Public Property TooltipText As String
    2. Get
    3. Return GetValue(TooltipTextProperty)
    4. End Get
    5. Set(ByVal value As String)
    6. SetValue(TooltipTextProperty, value)
    7. End Set
    8. End Property
    9. Public Shared ReadOnly TooltipTextProperty As DependencyProperty =
    10. DependencyProperty.Register("TooltipText",
    11. GetType(String), GetType(usercontrol_tooltip1),
    12. New PropertyMetadata(Nothing))


    Und im XAML dann darauf gebunden:

    XML-Quellcode

    1. <UserControl x:Name="uclTooltip" x:Class="usercontrol_tooltip1"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WpfApplication1"
    7. mc:Ignorable="d"
    8. d:DesignHeight="300" d:DesignWidth="300">
    9. <Grid>
    10. <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
    11. <Image/>
    12. <Label Content="{Binding TooltipText, ElementName=uclTooltip}"/>
    13. </StackPanel>
    14. </Grid>
    15. </UserControl>


    Anwendung:

    XML-Quellcode

    1. <Button Content="TestButton" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="10">
    2. <Button.ToolTip>
    3. <local:usercontrol_tooltip1 TooltipText="Das ist ein Test"/>
    4. </Button.ToolTip>
    5. </Button>




    Möglichkeit 2:

    Ein vorhandenes Property nutzen (einfacher):
    Es bieten sich viele an. Tag, Tooltip usw.
    Ich nehme jetzt mal Tooltip. Bietet sich ja an.
    Einfach an das ToolTip Property des UserControl Binden und von aussen genau dieses setzen da ja sowieso ein Dependency Property

    XML-Quellcode

    1. <UserControl x:Name="uclTooltip" x:Class="usercontrol_tooltip1"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WpfApplication1"
    7. mc:Ignorable="d"
    8. d:DesignHeight="300" d:DesignWidth="300">
    9. <Grid>
    10. <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
    11. <Image/>
    12. <Label Content="{Binding ToolTip, ElementName=uclTooltip}"/>
    13. </StackPanel>
    14. </Grid>
    15. </UserControl>


    Und von aussen setzen:

    XML-Quellcode

    1. <Button Content="TestButton" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="10">
    2. <Button.ToolTip>
    3. <local:usercontrol_tooltip1 ToolTip="Das ist ein Test"/>
    4. </Button.ToolTip>
    5. </Button>


    Sieht dann genau gleich wie im erten Bild aus. Ändert sich ja nichts was die Optik betrifft.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Ich glaubte es verstanden zu haben aber dann...

    Im Grunde genommen die Gleiche Problematik:
    Ein UserControl "usercontrol_button1" mit einem Image. Die Source des Image soll von außen angepaßt werden. Es erscheint zwar das gewählte Bild aber nicht innerhalb des "usercontrol_button1" sondern das Image wird über das mycontrol: usercontrol_button1 gezeichnet.. Es geht mir um o.g. Lösungsansatz 2:

    XML-Quellcode

    1. <UserControl x:Class="usercontrol_button1"
    2. x:Name="usercontrol_btn1"
    3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    7. xmlns:mycontrol="clr-namespace:xyz"
    8. mc:Ignorable="d"
    9. Height="Auto"
    10. Width="Auto"
    11. Cursor="Hand">
    12. <Border Width="40" Height="40" BorderThickness="2" BorderBrush="Gray" CornerRadius="20" Padding="3" Background="LightGray" Margin="3 0 3 0">
    13. <Image Stretch="Fill" Source="{Binding Image, ElementName=usercontrol_btn1}"/>
    14. </Border>
    15. </UserControl>
    16. <mycontrol:usercontrol_button1 x:Name="cntrl_agenda">
    17. <Image Source="/VISION_Client;component/images/logo_final.ico" />
    18. <mycontrol:usercontrol_button1.ToolTip>
    19. <mycontrol:usercontrol_tooltip1 ToolTip="Agenda | Aufgaben"/>
    20. </mycontrol:usercontrol_button1.ToolTip>
    21. </mycontrol:usercontrol_button1>


    Durch das Anlegen der Source in mycontrol:usercontrol_button1 für Image sollte eigentlich die Source in das o.g. usercontrol durch ein Binding übernommen werden; macht es aber nicht.
    Hallo

    Nene. Du setzt ja quasi den Content also den Inhalt des UserControls was mal gar keinen Sinn hat.
    Da könntest du gleich ein ContentControl nehmen.

    Sehe ich das richtig das du nun bereits zwei Eigenschaften (Tooltip und Image) für ein UserControl von aussen setzen willst?
    Das kommst du (wenn es noch mehr werden eh nicht mehr um Erklärung Nummer 1 von oben rum).
    In dem Fall mit ToolTip und Image würde es sogar noch so gehen das ich ToolTip auf Tooltip übergebe und Image in Tag da Tag vom Typ Object ist.

    Beispiel:

    XML-Quellcode

    1. <UserControl x:Name="userControl" x:Class="uclTestUserControl"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WpfApplication1"
    7. mc:Ignorable="d"
    8. d:DesignHeight="450" d:DesignWidth="800">
    9. <Grid>
    10. <Image Source="{Binding Tag, ElementName=userControl}" ToolTip="{Binding ToolTip, ElementName=userControl}"/>
    11. </Grid>
    12. </UserControl>


    oder schöner indem ich schon beim Grid des DataContext setze:

    XML-Quellcode

    1. <UserControl x:Name="userControl" x:Class="uclTestUserControl"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WpfApplication1"
    7. mc:Ignorable="d"
    8. d:DesignHeight="450" d:DesignWidth="800">
    9. <Grid DataContext="{Binding ElementName=userControl}">
    10. <Image Source="{Binding Tag}" ToolTip="{Binding ToolTip}"/>
    11. </Grid>
    12. </UserControl>


    Da bekanntlich viele Wege nach Rom führen hier wieder auch für die Anwendung zwei Beispiele:

    XML-Quellcode

    1. <StackPanel>
    2. <local:uclTestUserControl Tag="https://www.vb-paradise.de/wcf/images/wbbLogo_vbp.png" ToolTip="Das ist ein neuer Test"/>
    3. <local:uclTestUserControl>
    4. <local:uclTestUserControl.ToolTip>
    5. <StackPanel>
    6. <TextBlock Text="Das ist ein Test"/>
    7. <TextBlock Text="Aber ein neuer" Foreground="Red"/>
    8. </StackPanel>
    9. </local:uclTestUserControl.ToolTip>
    10. <local:uclTestUserControl.Tag>
    11. https://www.vb-paradise.de/wcf/images/wbbLogo_vbp.png
    12. </local:uclTestUserControl.Tag>
    13. </local:uclTestUserControl>
    14. </StackPanel>


    Hier noch ein Bild:


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Oh Du bist aber Inter- nett... :)
    Hier in diesem Beispiel will ich nur ein UserControl im Usercontrol; Tooltip in Button. Ich kann mir das Ganze aber noch viel umfangreicher vorstellen; gerade im Bereich Tooltip oder PopUp; viel verschachtelter und umfangreicher.... ich muß schon in's Bett. Bis morgen
    Bedeutet das nun das dir die Antwort geholfen hat oder eher nicht.

    Willst du ein UserControl in ein UserControl haben willst dann mach das einfach so. Pa k das UCL in das UCL und gut ists. Warum muss ich das von aussen setzen können??
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.