2010-08-31 82 views
7

我有一个带可扩展面板的WPF窗口(通过Expander)。面板位于窗口的左侧,展开后窗口会长大以适应内容。WPF - 向左扩展窗口

默认情况下,窗口锚定在左上角,所以我的窗口向右增长。我希望窗户向左增长。

我试图做的Window.SizeChanged事件如下:

private void onWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Left -= (e.NewSize.Width - e.PreviousSize.Width) 
} 

和它的作品,但增长是干的,我想找到一个平滑的解决方案。

+0

我正在玩你目前的解决方案,它也似乎有问题。如果你调整窗口的大小(即不使用扩展器),那么调整大小真的很不稳定。在我的结尾,调整窗口大小的行为也会打破窗口调整大小的代码,并且不再向左扩展。 – Dave 2010-09-08 13:32:23

回答

4

我设法克服这种使用简单的解决方案:隐藏&显示。

下面的代码:

protected override void OnRenderSizeChanged(SizeChangeInfo sizeInfo) 
{ 
    if (!sizeInfo.WidthChanged) 
    { 
     base.OnRenderSizeChanged(sizeInfo); 
     return; 
    } 
    Hide(); 
    base.OnRenderSizeChanged(sizeInfo); 
    Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width); 
    Show(); 
} 

我取代了事件处理程序Window.SizeChanged与此覆盖的FrameworkElement.OnRenderSizeChanged

0

你可以把你的扩展器放在一个网格中(列的大小可以改变),然后将扩展器的ExpandDirection属性设置为left?

+0

我希望*窗口*向左增长。扩展器向左增长很好,但窗口大小适合右侧的内容(所以一切都在移动)。 – 2010-09-03 05:23:12

1

解决方案1 ​​

尝试使用Window属性:SizeToContent =“宽度”,这将你的窗口扩展到内容的大小,你可以使用你的内容动画和宽松,这将使缩放比例窗户非常光滑。

解决方案2

您可以创建一个窗口,它是大于它的内容,让你的背景是透明的。您仍然需要为某个元素添加背景。

这里是它如何可能看起来像一个例子: example image

+0

解决方案1仍然会导致窗口调整到左侧,否?解决方案2很好,但我不能使用带标题栏的常规窗口。我必须亲自模仿。 – 2010-09-06 19:43:12

2

我没有试图让一个窗口增长到左像你要求什么,但如果一切都失败了,我会考虑模板化按钮看起来像扩展器按钮。然后,而不是试图让您的窗口增长到左侧,使用变换使一个新的窗口增长到主窗口的左侧。

UPDATE

好,渲染性能不佳可能是相关的视频卡,相关的布局(过于复杂),或两者兼而有之。我有一个想法可以为你做诡计。 Jeff Prosise在Silverlight中发布了一个放大镜,它使用WriteableBitmap来达到预期的效果。我想,“为什么不使用WriteableBitmap在Expander的右边创建布局的屏幕截图,并用它来掩盖其他元素?”。我认为如果你这样做并隐藏底层元素(这样他们就不会被调整),渲染性能将大大提高。

我得到了Jeff的代码,在WPF中工作很少修改。

http://www.wintellect.com/CS/blogs/jprosise/archive/2009/10/29/more-fun-with-silverlight-3-s-writeablebitmap.aspx

+0

我无法理解您的建议。你能否详细说明一下? – 2010-09-07 08:56:27

+0

@Omer很好,*如果*我正确理解你的情况,你有一个向左打开的扩展器。但是当你这样做时,窗口会调整到正确的位置,并且整个内容都会转移,我认为这会让你看起来有点波涛汹涌。如果你保持整个窗口*完好无损*,它永远不需要调整其子节点。您可以使用看起来像扩展器的按钮来伪造这种效果,但是当您单击它时,处理程序可以在主窗口的左侧创建一个完全独立的窗口,从而避免整个调整大小问题。你可以制作动画。 – Dave 2010-09-07 12:36:02

+0

好吧,我明白了 - 但这是一种带有副作用的黑客攻击:最终结果看起来不像一个窗口(只有一个标题栏)。我正在寻找一个能给我一个窗口的解决方案。 – 2010-09-08 08:44:29