簡體   English   中英

在wpf中動態地將圖像分配給文本框模板

[英]Dynamically assign image to textbox template in wpf

我已經為文本框實現了一個模板來顯示其中的圖像,但我遇到的問題是我無法動態顯示圖像。 這是我的代碼

Window.xaml

<TextBox Style="{StaticResource imageTextBox}" />

這是我的文本框模板

<Style TargetType="Control" x:Key="imageTextBox">
    <Setter Property="Margin" Value="0,0,0,8"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Control">
                <Border x:Name="bg" BorderThickness="1" CornerRadius="3" BorderBrush="Gray">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBox Style="{DynamicResource BasicTextBox}" Grid.Column="1" 
                                 Foreground="{TemplateBinding Foreground}" 
                                 Background="{TemplateBinding Background}" 
                                 FontFamily="{TemplateBinding FontFamily}"
                                 FontSize="{TemplateBinding FontSize}"
                                 FontWeight="{TemplateBinding FontWeight}"
                                 MinWidth="340" Margin="1" />
                        <Image Source="Images/img_1.gif" Width="20"/>
                    </Grid>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" TargetName="bg" Value="Black"/>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="BorderBrush" TargetName="bg" Value="Black"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="BasicTextBox" TargetType="{x:Type TextBox}">
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="BorderThickness" Value="0"/>
</Style>

您可以使用{Binding}作為<Image.Source>屬性。 是一個LinqPad查詢示例免費獲得LinqPad ):

void Main()
{
    // Need to parse XAML since LinqPad doesn't have an integrated XAML build
    var xaml = @"
    <Grid xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
    <Grid.Resources>
    <Style TargetType=""Control"" x:Key=""imageTextBox"">
        <Setter Property=""Margin"" Value=""0,0,0,8""/>
        <Setter Property=""Template"">
            <Setter.Value>
                <ControlTemplate TargetType=""Control"">
                    <Border x:Name=""bg"" BorderThickness=""1"" CornerRadius=""3"" BorderBrush=""Gray"">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width=""30""/>
                                <ColumnDefinition Width=""*""/>
                            </Grid.ColumnDefinitions>
                            <TextBox Style=""{DynamicResource BasicTextBox}"" Grid.Column=""1""
                                     Foreground=""{TemplateBinding Foreground}""
                                     Background=""{TemplateBinding Background}""
                                     FontFamily=""{TemplateBinding FontFamily}""
                                     FontSize=""{TemplateBinding FontSize}""
                                     FontWeight=""{TemplateBinding FontWeight}""
                                     MinWidth=""340"" Margin=""1"" />
                            <Image Source=""{Binding Image}"" Width=""20""/>
                        </Grid>
                    </Border>

                    <ControlTemplate.Triggers>
                        <Trigger Property=""IsMouseOver"" Value=""True"">
                            <Setter Property=""BorderBrush"" TargetName=""bg"" Value=""Black""/>
                        </Trigger>
                        <Trigger Property=""IsFocused"" Value=""True"">
                            <Setter Property=""BorderBrush"" TargetName=""bg"" Value=""Black""/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    </Grid.Resources>
    <TextBox Style=""{StaticResource imageTextBox}"" />
    </Grid>
    ";

    // Get some images... these could be in your resources
    var png = PngBitmapDecoder.Create(new Uri("https://upload.wikimedia.org/wikipedia/commons/9/97/Esperanto_star.png"), BitmapCreateOptions.None, BitmapCacheOption.Default);
    var vm = new ViewModel { Image = png.Frames[0] };
    var o = (FrameworkElement)XamlReader.Parse(xaml);
    // Set the image source - in this case, a view model
    o.DataContext = vm;
    // Let LinqPad display it
    PanelManager.DisplayWpfElement(o);

    // This code is for the example only, to change the image after 2 seconds.
    var dispatcher = o.Dispatcher;
    Task.Run(async () =>
    {
        await Task.Delay(2000);
        await dispatcher.BeginInvoke((Action)(() =>
        {
            png = PngBitmapDecoder.Create(new Uri("https://upload.wikimedia.org/wikipedia/commons/f/f6/Lol_question_mark.png"), BitmapCreateOptions.None, BitmapCacheOption.Default);
            vm.Image = png.Frames[0];
        }));
    });
}

// Define other methods and classes here
public class ViewModel : INotifyPropertyChanged
{
    private ImageSource _image;
    public event PropertyChangedEventHandler PropertyChanged;

    public ImageSource Image
    {
        get
        {
            return _image;
        }
        set
        {
            if (_image == value)
            {
                return;
            }

            _image = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Image)));
        }
    }
}

此示例使用簡單視圖模型作為Binding源,但它可以是任何源。 還有一些代碼在2秒延遲后更改Image值,以顯示它確實更新了。 在您的代碼中,您將省略它並使用您想要更新它的方式。

起初看來: 首次出現的形象

然后更新后: 更新后的外觀

暫無
暫無

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

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