[英]WPF: Byte array to Image on a button in code behind
I have tried many combinations of things but with no joy. 我尝试了许多事情的组合,但没有喜悦。
Here is what i think should work, but I get a blank button: 这是我认为应该工作的,但是我得到了一个空白按钮:
ImageConverter ic = new ImageConverter();
System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom myByteArray);
Bitmap bitmap = new Bitmap(img);
MemoryStream ms = new MemoryStream();
ImageBrush brush = new ImageBrush();
bitmap.Save(ms, ImageFormat.Png);
ms.Position = 0
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CreateOptions = BitmapCreateOptions.None;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = ms;
bi.EndInit();
brush.ImageSource = bi;
button.Background = brush;
Any suggestions welcome... this has to be done in the code behind also. 欢迎任何建议...这也必须在后面的代码中完成。
Sorry, just to add that I am using WPF, MVVM approach. 抱歉,我要使用的是WPF,MVVM方法。
This code works on one dialog window but NOT on another: 此代码的工作在一个对话窗口,但没有其他:
So I open a dialog window from the main window and then open another dialog window, this code shows the image on the buttons fine... however when i open a 3rd dialog window, and try the same code, the buttons are blank... 所以我从主窗口打开一个对话窗口,然后打开另一个对话窗口,此代码很好地显示了按钮上的图像...但是,当我打开第三个对话窗口并尝试相同的代码时,按钮为空白。 。
_stockButtons[i].Width = 100;
_stockButtons[i].Height = 100;
ImageBrush brush2 = new ImageBrush();
BitmapImage bitmap2 = new BitmapImage();
bitmap2.BeginInit();
bitmap2.UriSource = new Uri(@"C:\Users\Kevin\Pictures\test.jpg");
bitmap2.EndInit();
brush2.ImageSource = bitmap2;
_stockButtons[i].Background = brush2;
If I use the above code to load the images into the buttons on the initial load of the window, the images are displayed OK... The issue seems to be when I select a button on the left column, then I display an amount (1 or more) of buttons for the items related to the clicked department. 如果我使用上面的代码将图像加载到窗口的初始加载按钮上,则图像显示为OK。问题似乎是当我在左列中选择一个按钮时,我显示了一个金额( 1个或更多)与所单击部门相关的项目的按钮。 The image seems to be lost somewhere or not being pulled in correctly?
图像似乎在某处丢失或未正确拉入? Does that makes sense?
这有意义吗?
<Window x:Class="Views.WindowsViews.SelectStockDialogWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModel="clr-namespace:ViewModels;assembly=ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxd="http://schemas.devexpress.com/winfx/2008/xaml/docking"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:Support="clr-namespace:Support;assembly=Support"
xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Royale"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Select stock item"
mc:Ignorable="d" WindowStartupLocation="CenterScreen" Width="585" Height="600" >
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Views;component/Styles/Brushes.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<dxd:DockLayoutManager Name="dlSalesScreen">
<dxd:DockLayoutManager.LayoutRoot>
<dxd:LayoutGroup Name="Root" Orientation="Horizontal" AllowSplitters="False">
<dxd:LayoutPanel AllowClose="False" AllowRename="False"
Caption="Departments" HorizontalScrollBarVisibility="Hidden"
CaptionAlignMode="AutoSize"
CaptionImageLocation="BeforeText" ShowPinButton="False" >
<!-- Scrollviewer for department buttons-->
<ScrollViewer x:Name="deptScrollviewer" Grid.Row="0" Grid.Column="0" Width="185" Height="Auto" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" PanningMode="VerticalOnly">
<ItemsControl ItemsSource="{Binding Departments}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel VerticalAlignment="Top" Height="Auto" Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
</dxd:LayoutPanel>
<dxd:LayoutPanel AllowClose="False" AllowRename="False"
Caption="Available stock in department" Width="Auto"
CaptionAlignMode="AutoSize"
CaptionImageLocation="BeforeText" ShowPinButton="False">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<!-- Scrollviewer for stock buttons-->
<ScrollViewer x:Name="stockScrollViewer" Grid.Row="0" Width="Auto" Height="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" PanningMode="VerticalOnly">
<ItemsControl ItemsSource="{Binding StockItems, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel VerticalAlignment="Top" HorizontalAlignment="Left" Orientation="Horizontal" Width="400" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
<Rectangle Grid.Row="1" Margin="0,0,0,0" Height="Auto" Fill="{StaticResource BottomRectangleGradient}" />
<Grid Name="gridButtonHolder" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<GroupBox x:Name="grpStockItem" Grid.Column="0" Header="Selected Item" HorizontalAlignment="Left" Width="200" >
<Label x:Name="lblStockName" Content="{Binding SelectedStockItemLabel}" HorizontalAlignment="Left" />
</GroupBox>
<Button Name="btnSave" Content="Apply" Command="{Binding ConfirmSelectionCommand}" dxc:ThemeManager.ThemeName="Office2007Blue" Grid.Column="1" Width="110" Height="42" Margin="0,8,0,0" />
<Button Name="btnClose" Content="Cancel" dxc:ThemeManager.ThemeName="Office2007Blue" Grid.Column="2" Width="110" Height="42" Margin="0,8,0,0" />
</Grid>
</Grid>
</dxd:LayoutPanel>
</dxd:LayoutGroup>
</dxd:DockLayoutManager.LayoutRoot>
</dxd:DockLayoutManager>
</Window>
Try this (without using the WinForms images) 试试看(不使用WinForms图像)
ImageBrush brush;
BitmapImage bi;
using (var ms = new MemoryStream(myByteArray))
{
brush = new ImageBrush();
bi = new BitmapImage();
bi.BeginInit();
bi.CreateOptions = BitmapCreateOptions.None;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = ms;
bi.EndInit();
}
brush.ImageSource = bi;
button.Background = brush;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.