【问题标题】:WPF set image for a button in the C# code behind at runtimeWPF 在运行时为后面的 C# 代码中的按钮设置图像
【发布时间】:2009-08-05 11:06:47
【问题描述】:

我是 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);

谁能指出我哪里出错了,如果我猜的话,我会说我认为我在设置值的地方,我实际上不是。

干杯

【问题讨论】:

  • 'b' 是什么类型?您的 UserControl 派生按钮?
  • 问题是 Button 不是 Image.. 而且您正试图在 b.. 上设置一个奇怪的属性(用于按钮)。您可以在按钮的内容上设置位图并使用数据模板(看答案)
  • 已编辑以显示 B. @Arcturus,我认为这可能是问题所在,我只是不确定如何设置它,如果数据模板是要走的路,非常感谢.

标签: c# wpf image button


【解决方案1】:

您可以尝试使用 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,等等 :)

【讨论】:

  • 好的...我和你在一起。我必须承认我还没有达到绑定。您能否指出我如何定义“{Binding}”的方向?谢谢
  • 只是一个简短的点,我看不到你上面的例子中按钮的文本是如何设置的?
  • 当您在 Button 上设置 Content 时,ContentControl (Button) 将使用实习生 ContentPresenter。 ContentPresenter 会将 Content 设置为其 DataSource。 DataSource 属性是决定直接绑定的属性。所以 {Binding} 创建了一个到 DataSource 的绑定,它恰好是位图图像的内容...... :)
  • 啊对不起..我跳过了文字..让我补充一下;)
  • 好的,看起来不错。但是,如果我希望文本和图像是动态的呢?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多