使用位图的TreeView / ScrollView渲染错误?

时间:2016-08-03 11:29:02

标签: wpf scroll bitmap treeview

有一个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());

它显示所有正常,但是当我们滚动树时,有时位图会变形。大部分都接近底部。有时我们需要调整树的大小,但它迟早会发生。

ItemX是文本,旁边的表是位图。 enter image description here

在此之后,当它出错时,如果我用滚动条位置 - 拇指滚动树,只需向上/向下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());

然后经过一些滚动,我得到了这个: enter image description here

任何帮助,想法都会受到赞赏。

我尝试了什么:
选中,生成的'BitmapSource'为96 DPI 保存到文件中所有生成的'BitmapSource' - 一切都很好,而它们在屏幕上被扭曲了 我没有想法,似乎这是一个WPF错误?或者也许视频驱动? (nvidia quadro / laptop / win7 64bit)

SO IN SHORT

TreeView显示从XAML中指定的文件加载的位图:确定(有时也会出现非常小的故障,但这些都是可以接受的)
TreeView显示生成的BitmapSource的位图: FAILS有时(滚动期间)

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 不知道为什么它有效,但似乎解决了这个问题:

如果在imageConverter中(在本机控件中)我返回BitmapImage ^而不是BitmapSource ^,它没问题。
很奇怪,但我只是从BitmapSource创建BitmapImage,返回它,没有问题 WPF太可怕了......