簡體   English   中英

WPF自定義按鈕圖標和文本從代碼更改

[英]Wpf Custom button icon and text change from code

所以我要簡短。 我想使用另一個從這里編譯的.dll文件中的代碼設置textBlock(x:Name =“ ButtonText”)和圖像(x:Name =“ LeftIcon”和x:Name =“ RightIcon”)。

XAML:

<Button x:Class="myClass.actionButton"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   x:Name="ActionButton">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Border x:Name="button" CornerRadius="10" BorderBrush="#F555" BorderThickness="1.5">
                <Border.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#CC323232" Offset="0"/>
                        <GradientStop Color="#CC4B4B4B" Offset="1"/>
                    </LinearGradientBrush>
                </Border.Background>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="24"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="24"/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Name="ButtonText" Grid.Column="1" HorizontalAlignment="Center" TextWrapping="Wrap" Margin="0,0,0,0" VerticalAlignment="Center" Width="auto"/>
                <Image x:Name="LeftIcon" Grid.Column="0" HorizontalAlignment="Left" Height="16" Margin="4,1,0,0" VerticalAlignment="Center" Width="16"/>
                <Image x:Name="RightIcon" Grid.Column="2" HorizontalAlignment="Right" Height="16" Margin="0,1,4,0" VerticalAlignment="Center" Width="16"/>
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
            </Border>
        </ControlTemplate>
    </Button.Template>
</Button>

CS:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Windows.Markup;

namespace myClass
{
    public partial class actionButton : Button
    {
        private TextBlock ButtonText;
        private Image LeftIcon;
        private Image RightIcon;

        public Image leftIcon
        {
            get { return LeftIcon; }
            set { LeftIcon = value; }
        }

        public Image rightIcon
        {
            get { return RightIcon; }
            set { RightIcon = value; }
        }

        public TextBlock buttonText
        {
            get { return ButtonText; }
            set { ButtonText = value; }
        }

        public actionButton()
        {
            InitializeComponent();
        }
    }

}

目前,如果我將新的textBlock從代碼追加到我的按鈕實例中,則不會顯示...對於圖像相同。 我想念什么?

感謝您的幫助... :)

您的actionButton類應為兩個圖像和文本聲明可綁定的依賴項屬性。

左圖的示例如下所示。 該屬性類型為ImageSource ,因為這是Image控件的Source屬性的類型。 您將必須為正確的圖像聲明第二個屬性,並為TextBlock文本聲明一個string類型的屬性。

public static readonly DependencyProperty LeftImageProperty =
    DependencyProperty.Register(
        nameof(LeftImage), typeof(ImageSource), typeof(actionButton));

public ImageSource LeftImage
{
    get { return (ImageSource)GetValue(LeftImageProperty); }
    set { SetValue(LeftImageProperty, value); }
}

在Button的XAML中,您可以將屬性與RelativeSource綁定一起使用:

<TextBlock Text="{Binding Text,
                  RelativeSource={RelativeSource AncestorType=Button}}" ... />
<Image Source="{Binding LeftImage,
                RelativeSource={RelativeSource AncestorType=Button}}" ... />
<Image Source="{Binding RightImage,
                RelativeSource={RelativeSource AncestorType=Button}}" ... />

由於這些綁定位於Button的模板中,因此您也可以使用TemplateBinding。 但是,您必須設置適當的TargetType:

<Button x:Class="MyNamespace.actionButton"
        ...
        xmlns:local="clr-namespace:MyNamespace">
    <Button.Template>
        <ControlTemplate TargetType="local:actionButton">
            ...
            <Image Source="{TemplateBinding LeftImage}" ... />
            ...
        </ControlTemplate>
    </Button.Template>
</Button>

現在,當您使用Button時,您可以像這樣簡單地設置(或綁定)這些屬性:

<local:ActionButton x:Name="ab" LeftImage="SomeImage.jpg"/>

或在后面的代碼中:

ab.LeftImage = new BitmapImage(new Uri("SomeImage.jpg", UriKind.RelativeOrAbsolute));

如果圖像文件應作為程序集資源嵌入,則應將其Build Action設置為Resource,然后從Resource File Pack URI加載它:

ab.LeftImage = new BitmapImage(new Uri("pack://application:,,,/SomeImage.jpg"));

請注意,您應該遵循廣泛接受的命名約定,並將其命名為ActionButton

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM