有一个WPF(.NET 3.5)TreeView,它包含位图。 没什么特别的:
<ControlTemplate x:Key="ctrlOutputTree" TargetType="{x:Type vo:OutputTreeView}">
<TreeView x:Name="OutputTree" ItemContainerStyle="{DynamicResource TreeViewItemStyle}"
KeyboardNavigation.TabNavigation="Cycle" SnapsToDevicePixels="True" MouseDown="OutputTree_MouseDown"
Loaded="OutputTree_Loaded" RenderOptions.BitmapScalingMode="NearestNeighbor">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<EventSetter Event="RequestBringIntoView" Handler="OutputTree_RequestBringIntoView"/>
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
<TreeViewItem ItemsSource="{Binding Converter={StaticResource featureDiffsSourceCreator},Mode=OneWay}"
IsExpanded="True" Margin="0,4,0,0"
KeyDown="AttrDiffTreeviewItem_KeyDown">
</TreeViewItem>
</TreeView>
</ControlTemplate>
TreeViewItems:
<ControlTemplate x:Key="ImageTemplate">
<Image VerticalAlignment="Top" Margin="3,1,0,0"
RenderOptions.BitmapScalingMode="NearestNeighbor"
RenderOptions.EdgeMode="Aliased"
Stretch="None">
<Image.Source>
<!-- <BitmapImage UriSource="c:\\imageBMP_test.bmp" />-->
<MultiBinding Converter="{StaticResource imageConverter}">
<Binding Path=....
</MultiBinding>
</Image.Source>
</v:Image>
</ControlTemplate>
位图在imageConverter中生成为BitmapSource(来自本机控件)。
System::Drawing::Bitmap^ b = System::Drawing::Image::FromHbitmap((IntPtr)aBmp);
IntPtr hb = b->GetHbitmap();
System::Windows::Media::Imaging::BitmapSource^ bs =
System::Windows::Interop::Imaging::CreateBitmapSourceFromHBitmap(hb,
System::IntPtr::Zero,
Int32Rect(0,0,nWidth,nHeight),
BitmapSizeOptions::FromEmptyOptions());
它显示所有正常,但是当我们滚动树时,有时位图会变形。大部分都接近底部。有时我们需要调整树的大小,但它迟早会发生。
在此之后,当它出错时,如果我用滚动条位置 - 拇指滚动树,只需向上/向下1个像素,它就会变得清晰又好。 但是,如果我使用滚动条上的向上/向下箭头滚动,位图仍然无效,只需点击几下(然后消失)
如果我替换XAML MultiBinding/imageConverter
中的BitmapSource生成 - &gt; <BitmapImage UriSource="c:\\imageBMP_test.bmp"
,然后不要遇到这个问题。 (我必须小心imageBMP_test.bmp为24位和96DPI,否则也不好)
如果我将BitmapSource生成更改为从文件读取(24或32位bmp,96dpi):
System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap("c:\\imageBMP24_96dpi_small.bmp");
IntPtr hb = b->GetHbitmap();
System::Windows::Media::Imaging::BitmapSource^ bs =
System::Windows::Interop::Imaging::CreateBitmapSourceFromHBitmap(hb,
System::IntPtr::Zero,
Int32Rect(0,0,nWidth,nHeight),
BitmapSizeOptions::FromEmptyOptions());
任何帮助,想法都会受到赞赏。
我尝试了什么:
选中,生成的'BitmapSource'为96 DPI
保存到文件中所有生成的'BitmapSource' - 一切都很好,而它们在屏幕上被扭曲了
我没有想法,似乎这是一个WPF错误?或者也许视频驱动? (nvidia quadro / laptop / win7 64bit)
SO IN SHORT
TreeView显示从XAML中指定的文件加载的位图:确定(有时也会出现非常小的故障,但这些都是可以接受的)
TreeView显示生成的BitmapSource的位图: FAILS有时(滚动期间)
答案 0 :(得分:0)
我找到了解决方案。 不知道为什么它有效,但似乎解决了这个问题:
如果在imageConverter中(在本机控件中)我返回BitmapImage ^而不是BitmapSource ^,它没问题。
很奇怪,但我只是从BitmapSource创建BitmapImage,返回它,没有问题
WPF太可怕了......