2016-11-03 42 views
4

我一直在用這個撓我的腦袋。作爲工具提示的WPF圖像 - DPI問題

在我的主窗口我有一個映像誰的工具提示應該彈出的圖像在它的實際尺寸(或不超過主窗口本身更大的高度):

<Image x:Name="ss1" Grid.Column="0" Grid.Row="0" Margin="0"> 
    <Image.ToolTip> 
     <ToolTip DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}"> 
      <Border BorderBrush="Black" BorderThickness="1" Margin="5,7,5,5"> 
       <Image Source="{Binding Source}" MaxHeight="{Binding ElementName=MW,Path=Height}" Stretch="Uniform" ToolTipService.Placement="Top"/> 
      </Border> 
     </ToolTip> 
    </Image.ToolTip> 
</Image> 

(主窗口的X:名稱是' MW「)

在另一類別處我加載的BitmapImage這個圖像控制:

Image img = (Image)mw.FindName("ss1"); 
img.Source = GetBitmapImageFromDisk(path, UriKind.Absolute); 

而且GetBitMapImageFromDisk方法:

public static BitmapImage GetBitmapImageFromDisk(string path, UriKind urikind) 
{ 
    if (!File.Exists(path)) 
     return null; 
    try 
    { 
     BitmapImage b = new BitmapImage(new Uri(path, urikind)); 
     return b; 
    } 
    catch (System.NotSupportedException ex) 
    {  
     BitmapImage c = new BitmapImage(); 
     return c; 
    }   
} 

圖像工具提示在鼠標懸停時彈出,但問題是圖像的大小似乎取決於圖像本身的DPI。因此,如果由於某種原因,它的目標是DPI爲762的圖像,則在顯示時,工具提示圖像非常小。

任何人都可以提出一種方法來緩解這與我目前的代碼?在運行時加載的圖像幾乎可以是任何尺寸,DPI和寬高比。

+3

也許有幫助的:http://stackoverflow.com/a/644625/1136211 – Clemens

回答

0

非常感謝Clemens提供的鏈接,它確實非常有用(特別是pixelwidth和pixelheight屬性)。

我在xaml中定義最大值時遇到了一些問題,所以最後我將邏輯抽象到後面的代碼中。

代碼的完整性:

XAML:

<Image x:Name="ss1" Grid.Column="0" Grid.Row="0" Margin="0"> 
    <Image.ToolTip> 
     <ToolTip DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}"> 
      <Border BorderBrush="Black" BorderThickness="1" Margin="5,7,5,5"> 
       <Image Source="{Binding Source}" Stretch="Uniform" ToolTipService.Placement="Top"/> 
      </Border> 
     </ToolTip> 
    </Image.ToolTip> 
</Image> 

另一類:

Image img = (Image)mw.FindName("ss1"); 
SetImage(img, path, UriKind.Absolute); 

方法:

public static void SetImage(Image img, string path, UriKind urikind) 
{    
    if (!File.Exists(path)) 
     return; 
    try 
    { 
     // load content into the image 
     BitmapImage b = new BitmapImage(new Uri(path, urikind)); 
     img.Source = b; 

     // get actual pixel dimensions of image 
     double pixelWidth = (img.Source as BitmapSource).PixelWidth; 
     double pixelHeight = (img.Source as BitmapSource).PixelHeight; 

     // get dimensions of main window 
     MainWindow mw = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault(); 
     double windowWidth = mw.ActualWidth; 
     double windowHeight = mw.ActualHeight; 

     // set max dimensions on Image.ToolTip 
     ToolTip tt = (ToolTip)img.ToolTip; 
     tt.MaxHeight = windowHeight/1.1; 
     tt.MaxWidth = windowWidth/1.1; 
     img.ToolTip = tt; 
    } 

    catch (System.NotSupportedException ex) 
    { 
     img.Source = new BitmapImage(); 
    } 
} 

一旦我能確定像素寬度&圖像的高度,在ToolTip本身上設置MaxHeight和MaxWidth相當簡單。