Ich möchte den folgenden Code mit einem benutzerdefinierten Steuerelement für die Schaltfläche umgestalten.WPF Custom/User Control für Schaltfläche mit Text und Symbol. Welches soll ich nehmen?
XAML-Datei: LoginWindow.xaml
<Button Grid.Column="0" Style="{DynamicResource BlackLoginButton}" Click="btnLogin_Click" IsDefault="True">
<DockPanel>
<TextBlock Text="text1" VerticalAlignment="Center"/>
<Image Source="../../../Assets/Images/apply.png" Style="{StaticResource ImageButton}" />
</DockPanel>
</Button>
-Code hinter: LoginWindow.xaml.cs
private void btnLogin_Click(object sender, EventArgs e)
{
Login();
}
ich besonders würde ich eine Struktur wie diese haben mag:
<local:CustomButton>
Grid.Column="0"
IsDefault="True"
Style="{DynamicResource BlackLoginButton}"
Click="btnLogin_Click"
Text="ciao"
Image="../../../Assets/Images/apply.png">
</local:CustomButton>
Ich versuche zu verwenden sowohl Custom Control als auch User Control.
Hier mein UserControl
XAML
<UserControl x:Class="foo.View.CustomUserControl.IconButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Button Style="{DynamicResource BlackLoginButton}">
<DockPanel>
<TextBlock VerticalAlignment="Center" Text="{Binding ElementName=Button, Path=Text}" />
<Image Source="{Binding ElementName=Button, Path=Image}" Style="{StaticResource ImageButton}" />
</DockPanel>
</Button>
</UserControl>
Und der Code hinter:
using System.Windows;
using System.Windows.Media;
namespace Mhira3D.View.CustomUserControl
{
public partial class IconButton
{
public static DependencyProperty ClickProperty = DependencyProperty.Register("Click", typeof(RoutedEventHandler),
typeof(IconButton));
public static DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource),
typeof(IconButton));
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(IconButton));
public IconButton()
{
InitializeComponent();
}
public RoutedEventHandler Click
{
get { return (RoutedEventHandler) GetValue(ClickProperty); }
set { SetValue(ClickProperty, value); }
}
public ImageSource Image
{
get { return (ImageSource) GetValue(ImageProperty); }
set { SetValue(ImageProperty, value); }
}
public string Text
{
get { return this.GetValue(TextProperty) as string; }
set { this.SetValue(TextProperty, value); }
}
}
}
Das Hauptproblem dieser Struktur ist, dass ich nicht Button
Eigenschaft verwenden kann (ich von Taste nicht erben), zum Beispiel kann ich IsDefault
nicht verwenden.
ich denke, es könnte eine Alternative Gebrauch sein ein CustomControl
auf die Schaltfläche Eigenschaft in einer besseren Art und Weise zu verwenden, wie folgt aus (in thi Beispiel, das ich nur setzen die Image
Eigenschaft):
public class IconButtonCustom : Button
{
static IconButtonCustom()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(IconButtonCustom), new FrameworkPropertyMetadata(typeof(IconButtonCustom)));
}
public ImageSource Image
{
get { return GetValue(SourceProperty) as ImageSource; }
set { SetValue(SourceProperty, value); }
}
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Image", typeof(ImageSource), typeof(IconButtonCustom));
}
Und der Stil in Generic.xaml
<Style TargetType="{x:Type customUserControl:IconButtonCustom}" BasedOn="{StaticResource BlackLoginButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type customUserControl:IconButtonCustom}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<DockPanel>
<TextBlock VerticalAlignment="Center" Text="{Binding ElementName=Button, Path=Text}" />
<Image Source="{Binding ElementName=Button, Path=Image}" Style="{StaticResource ImageButton}" />
</DockPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Jetzt habe ich ein paar Fragen:
- Welche dieser Methoden ist besser geeignet, um eine benutzerdefinierte Schaltfläche zu erstellen?
- Mit beiden Methoden habe ich Problem beim Zuordnen der Klick-Funktion, in der Tat habe ich die
System.Windows.Markup.XamlParseException
, weil WPF die ZeichenfolgebtnLogin_Click
in der FunktionClick
nicht konvertieren kann. - Ich habe nie
Generic.xaml
verwendet, ist mein Beispiel korrekt oder sollte in irgendeiner Weise verbessert werden?
Suchen Sie nur nach einer Möglichkeit, für jede Instanz ein anderes Bild zu übergeben? –
Eine andere Bild-, Text- und Klickfunktion;) – Rowandish
Gibt es einen bestimmten Grund, warum Sie ein benutzerdefiniertes Steuerelement dann möchten? Weil Sie all das mit nur einer Schaltflächenstilvorlage tun können. –