2011-03-25 17 views
2

創建400 x 400畫布。放入一個200 x 400的藍色矩形。將另一個藍色矩形與Canvas.Left = 200一樣大小。將它包裝在Viewbox中並縮放視圖框。在某些分辨率下,儘管實際上它們應該是齊平的,但在矩形之間會出現一個白色的列。Silverlight中縮放後形狀之間的間隙

我該如何避免這種情況?到目前爲止,我發現的唯一方法是將右側矩形左側的畫布設置爲略小於200,比如199 - 但即使這樣也會在某些比例上顯示工件。

+0

我懷疑舍入錯誤,但是如何解決這個問題我不知道 - 除非你可以將第二個矩形的Canvas.Left綁定到1st的最右邊座標。 – ChrisF 2011-03-25 15:38:46

+0

這應該由UseLayoutRounding屬性(http://msdn.microsoft.com/en-us/library/system.windows.uielement.uselayoutrounding(v=vs.95).aspx)處理,但它似乎是該ViewBox控件以某種方式打破... – 2011-03-25 16:42:02

+0

@丹:我不認爲UseLayoutRounding會適用。 ViewBox不負責其內容的內部佈局。事實上,它可能只適用於在所有佈局計算已經發生之後會發生的內容的縮放轉換。這似乎證實了這樣一個事實,即可以使用Canvas的RenderTransform中的'ScaleTransform'來重現相同的工件,而無需查看框。 – AnthonyWJones 2011-03-25 21:31:10

回答

0

ViewBox中的ScaleTransform給你帶來麻煩。 Silverlight 5將提供用於文本的像素捕捉,但我不確定所有UI元素。

使用戴夫Reyea的Pixel Snapper可以幫你解決這個問題:

<UserControl x:Class="SO_Viewbox.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" 
       xmlns:local="clr-namespace:SO_Viewbox"> 

    <Viewbox> 
     <Canvas Width="400" Height="400" Background="Yellow"> 
      <local:Snapper Snap="TopLeft"> 
       <Rectangle Width="200" Height="400" Fill="Blue" /> 
      </local:Snapper> 
      <local:Snapper Canvas.Left="200" Snap="TopLeft"> 
       <Rectangle Width="200" Height="400" Fill="Blue" /> 
      </local:Snapper> 
     </Canvas> 
    </Viewbox> 
</UserControl> 

他還展示瞭如何實現它作爲一個dependency property。如果您可以修改Viewbox來糾正問題,那將是非常好的,但在我看來,這不能簡單地通過修改Viewbox的轉換來解決 - 相反,像素捕捉必須應用於每個後端元素視框中。

+0

不幸的是,這並沒有幫助這種情況。問題不在於分數像素邊界 - 這是縮放的人爲因素,而且他的像素捕捉器不起作用。 – 2011-04-07 02:32:42