WPF在运行时为C#代码中的按钮设置图像

时间:2009-08-05 11:06:47

标签: c# wpf image button

我对WPF很新,所以请耐心等待。

基本上我在WPF UserControl中定义了一个Style来显示带有图像的按钮,如下所示:

<UserControl.Resources>
    <Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <TextBlock  HorizontalAlignment="Center" VerticalAlignment="Center">
                        <Image Width="16" Height="16" Stretch="UniformToFill"/>
                        <ContentPresenter/>
                    </TextBlock>
                </ControlTemplate>
            </Setter.Value>

        </Setter>
    </Style>
</UserControl.Resources>

然后我在运行时向网格添加一些按钮(由于按钮的数量和类型是动态的,它必须在运行时)。

我想要做的是在运行时设置按钮的图像。我尝试了很多方法,但似乎都没有。在Xaml中设置源代码工作正常。我正在尝试的代码如下:

Button b = new Button();
// Create source.
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(@"C:\SourceCode\DSA\DSALibrary\Icons\money.png");
bi.EndInit();

b.SetValue(Image.SourceProperty, bi);

有没有人能指出我哪里出错了,如果我猜的话,我会说我认为我设定的价值,我实际上并非如此。

干杯

2 个答案:

答案 0 :(得分:3)

您可以尝试使用Button的Content属性,并声明DataTemplate以处理内容:

<UserControl.Resources>
    <Style TargetType="Button">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Width="16" Height="16" Stretch="UniformToFill" Source="{Binding}"/>
                        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="My button text" />
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</UserControl.Resources>

在按钮内容上设置BitmapImage,瞧瞧:)。

答案 1 :(得分:0)

您能否确认它是您正在创建的System.Windows.Controls.UserControl派生对象?

我的猜测是控件在创建它时会加载它的位图,因此在此之后设置图像源属性不会被捕获。您是否尝试过编程创建一个具有两阶段创建的按钮并在进行第二阶段之前进行设置?

您可以尝试调用按钮的Invalidate()函数以确保重绘。