应用程序是一个使用微软lync客户端的信使。在其中一个上下文中,我在listview中获取联系人(LyncClient的对象具有名称,图像,可用性等属性),并将它们加载到数据模板中,该模板定义如下:
<DataTemplate x:Key="ContactsTemplate">
<Grid HorizontalAlignment="Left" Width="150" Height="150" Margin="10">
<Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
<Image Source="{Binding Image}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
</Border>
<StackPanel VerticalAlignment="Bottom" Background="{Binding Availability, Converter={StaticResource AvailabilityToPresenceColor}}" Opacity="0.75">
<TextBlock Text="{Binding Name}" Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextStyle}" Height="20" Margin="15,0,15,15"/>
</StackPanel>
</Grid>
</DataTemplate>
它有一个Grid容器,我们在其中有一个图像和文本块控件,用于显示联系人的图像和名称,如下图所示,stackpanel的背景绑定到lync Contact 对象的Availability属性使用转换器将可用性状态映射到颜色,以便例如当联系人可用性繁忙时,stackpanel的背景将变为红色。
我也想对图像控制产生类似的效果。
我是绑定的新手,所以在这个bindig概念中完全丢失了。
我的想法是:图像有一个效果evend处理程序,所以我想用它来实现这个目的并使用
在某些情况下转换器内部我想使用一些我需要获取图像源的代码,但是我们通过绑定获取图像源
请告诉我你的想法。
你可以在代码中看到
<Image Source="{Binding Image}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title} effect="{Binding Availability, Converter={StaticResource AvailabilityToPresenceColor}}"/>
我只是使用联系对象的属性绑定图像控件源。我想将Contact对象的Availability属性发送到IValueConverter的Convert方法,或者我想将图像与整个 Contact 对象绑定(如果可能的话)...或者如果有其他方式请让我知道。
var bitmap = new BitmapImage();
bitmap.BeginInit();
MemoreyStream ms=new MemoryStream(_image);
bitmap.StreamSource = stream;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
var grayBitmapSource = new FormatConvertedBitmap();
grayBitmapSource.BeginInit();
grayBitmapSource.Source = ms;
grayBitmapSource.DestinationFormat = PixelFormats.Gray32Float;
grayBitmapSource.EndInit();
.....
现在问题是我有一个类型为FormatConvertedBitmap的grayBitmapSource,我不知道如何将它再次转换为Stream。
答案 0 :(得分:0)
我建议在WPF中查看有关图像处理的这篇文章:http://www.codeproject.com/Articles/237226/Image-Processing-is-done-using-WPF
使用图像处理逻辑,为每个可用性状态创建不同的图片。您可以使用IValueConverter,但这意味着每次可用性状态更改时都必须重新处理映像。相反,您只需更改Contact类,以便在更改Availability属性时,它会自动通知WPF以获取Image属性引用的图片:
public class Contact : INotifyPropertyChanged
{
// EDIT: INotifyPropertyChanged implementation.
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
// EDIT: INotifyPropertyChanged implementation.
private ContactAvailability _Availability;
public ContactAvailability Availability
{
get { return _Availability; }
set
{
_Availability = value;
NotifyPropertyChanged("Availability");
NotifyPropertyChanged("Image");
}
}
public BitmapImage _AvailablePicture;
public BitmapImage _BusyPicture;
public BitmapImage Image
{
get
{
switch (this.Availability)
{
case ContactAvailability.Available:
return this._AvailablePicture;
case ContactAvailability.Busy:
return this._BusyPicture;
default:
throw new NotImplementedException();
}
}
}
}
编辑(评论时间过长):
我添加了实现INotifyPropertyChanged
接口的代码。这在WPF中很常见,所以我认为你已经熟悉这种方法了。
在您的示例中,Image.Source
是DepencyProperty
。当一个类实现INotifyPropertyChanged
时,您可以告诉WPF其中一个属性已更改。您只需使用已更改的属性的名称引发NotifyPropertyChanged
事件。这表示WPF更新绑定到给定属性的所有DepencyProperty
。
这与图像处理方面的绑定有何不同。我的意思是每当可用性改变时,这样也应该执行图像处理代码。我是对还是不对@bouvierr?
没有。在这种情况下,我们只会执行固定次数的图像处理,以便为每个可用性状态创建图片(在我的示例中为每个联系人创建2次)。例如,我们可以在应用程序启动期间创建所有图片(3个联系人x 2状态= 6张图片),并将它们存储在每个联系人的_AvailablePicture
和_BusyPicture
字段中。
以下是重要部分:当我们设置Availability
属性时,我们也会调用NotifyPropertyChanged("Image")
。这将迫使WPF更新Image.Source
DepencyProperty
,因为它绑定到Contact.Image
。这将返回不同的图片,因为Availability
已更改。
在我的例子中,我决定存储图片。这可能不是最适合您的解决方案。它消耗更多内存,但节省了处理时间。如果您希望每次可用性状态更改时重新处理图像,则应将Contact.Image
属性更改为:
public BitmapImage Image
{
get
{
switch (this.Availability)
{
case ContactAvailability.Available:
return this._AvailablePicture;
case ContactAvailability.Busy:
return GetImageWithColorFilter(this._AvailablePicture, Colors.Red);
default:
throw new NotImplementedException();
}
}
}