2016-08-03 58 views
1

Es gibt eine WPF (.NET 3.5) TreeView, die Bitmaps enthält. Nichts Besonderes:TreeView/ScrollView Rendering Bug mit Bitmaps?

<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> 

Die Bitmaps werden als Bitmap in Image Converter erzeugt (aus nativen Kontrolle).

Es zeigt alles gut, aber wenn wir den Baum scrollen, manchmal Bitmaps verzerrt wird. Meist nahe am Boden. Manchmal müssen wir die Größe des Baumes anpassen, aber das passiert früher oder später.

ItemX ist Text, und die Tabelle daneben ist die Bitmap.

Danach, wenn es falsch ist, wenn ich den Baum mit der Scrollbar-Position-Daumen, nur 1 Pixel nach oben/unten scrollen, wird es scharf und wieder gut. Aber wenn ich mit nach oben/unten Pfeile auf dem Scrollbar scrollen, Bitmaps bleiben ungültig für ein paar klicken (dann geht weg)

Wenn ich die Bitmap Generation in XAML MultiBinding/imageConverter ersetzen -><BitmapImage UriSource="c:\\imageBMP_test.bmp", dann nicht erleben diese Problem. (Ich muss nehmen Sie die imageBMP_test.bmp Pflege 24 Bits sein & 96 dpi, sonst auch gut nicht)

Wenn ich die Bitmap Generation ändern aus der Datei (24 oder 32 Bit bmp mit 96 dpi) zu lesen:

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()); 

Dann nach einigen Scrollen, habe ich dies: enter image description here

Jede Hilfe, Idee würde geschätzt.

Was ich versucht habe:
Überprüft, generiert "BitmapSource" ist 96 DPI.
Gespeichert in Datei alle generierten "BitmapSource" - alle waren in Ordnung, während sie auf dem Bildschirm verzerrt wurden.
Ich habe keine Ideen, scheint es ein WPF-Fehler zu sein? Oder vielleicht Videotreiber? (Nvidia quadro/Laptop/win7 64bit)

SO KURZ

TreeView zeigt Bitmap aus einer Datei in XAML angegeben geladen: OK (sehr kleinen Pannen hier auch manchmal, aber das ist akzeptabel)
TreeView zeigt Bitmap von BitmapSource an generiert: FEHLER manchmal (während scroll)

+0

nur zum Spaß versuchen Sie eine 'ViewBox' und sehen. – AnjumSKhan

+0

@AnjumSKhan können Sie mehr Details angeben, wo soll ich es verwenden? – Zotyi

+0

Btw, ich erweiterte die ursprüngliche Frage mit mehr Informationen/Beispiel/Screenshot – Zotyi

Antwort

0

Ich fand eine Lösung. Keine Ahnung, warum es funktioniert, aber scheint das Problem zu lösen:

wenn ich in der ImageConverter (in einem nativen Steuerelement) BitmapImage^anstelle von BitmapSource^zurückgeben, ist es in Ordnung.
Sehr seltsam, aber ich erstelle nur BitmapImage von der BitmapSource, gebe das zurück und keine Probleme.
WPF ist schrecklich ...