2010-11-08 77 views
2

我正在VS2010中創建一個WPF應用程序。我正在使用多個網格控件分層疊加,以執行與選項卡控件類似的功能。網格控件具有不透明(白色)背景。如何刪除Visual Studio 2010中的控件大綱,WPF?

發生這種問題是因爲無論我在設計窗口中「前面」有哪個網格,我仍然可以看到頂部面板「後面」的其他網格上的所有其他控件的所有輪廓。這在視覺上非常混亂。

這隻發生在設計時。在運行時,事情顯示得很好。

如何關閉所有其他控件的輪廓?

下面的屏幕截圖顯示了我的頂部網格,其中只包含4個文本框和4個單選按鈕,但顯示其他網格上所有其他控件的輪廓。

alt text

回答

3

設置任何網格控件,其不希望看到一個輪廓的RenderTransform,例如:

<Grid RenderTransform="1 0 0 1 10000 10000"> 

你可以使用一個附加屬性,使這個方便,讓您的網格自動設置爲每當它是通過編寫簡單的隱藏變換:

<Grid my:OutOfThisWorld.WhenHidden="True"> 

下面是代碼:

public class OutOfThisWorld : DependencyObject 
{ 
    // GoAway 
    public static bool GetGoAway(DependencyObject obj) { return (bool)obj.GetValue(GoAwayProperty); } 
    public static void SetGoAway(DependencyObject obj, bool value) { obj.SetValue(GoAwayProperty, value); } 
    public static readonly DependencyProperty GoAwayProperty = DependencyProperty.RegisterAttached("GoAway", typeof(bool), typeof(OutOfThisWorld), new UIPropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     obj.SetValue(UIElement.RenderTransformProperty, 
     (bool)e.NewValue ? new TranslateTransform(100000,10000) : null); 
    } 
    }); 

    // WhenHidden 
    public static bool GetWhenHidden(DependencyObject obj) { return (bool)obj.GetValue(WhenHiddenProperty); } 
    public static void SetWhenHidden(DependencyObject obj, bool value) { obj.SetValue(WhenHiddenProperty, value); } 
    public static readonly DependencyProperty WhenHiddenProperty = DependencyProperty.RegisterAttached("WhenHidden", typeof(bool), typeof(OutOfThisWorld), new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     if((bool)e.NewValue) 
     BindingOperations.SetBinding(obj, GoAwayProperty, 
      new Binding("Visibility") 
      { 
      RelativeSource=RelativeSource.Self, 
      Converter = new IsHiddenConverter() 
      }); 
    } 
    }); 

    class IsHiddenConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (Visibility)value == Visibility.Hidden; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } 
    } 
} 

工作原理:設置OutOfThisWorld.WhenHidden將創建一個到OutOfThisWorld.GoAway屬性的綁定,只要目標的可見性爲「隱藏」,GoAway屬性就爲true。當GoAway真正實現時,將添加RenderTransform。

說了這麼多,你有沒有考慮過使用Visibility = Collapsed而不是Visibility = Hidden?這可能會更簡單。

我也必須強烈支持Will的觀察,這是一個糟糕的設計。如何「堅持下去」是真的嗎?如果這是一件政治事情,我爲你感到難過。但從技術角度來看,使用模板將其重構爲真正的選項卡控件應該非常容易。

+0

謝謝Ray,這個解決方法解決了問題中提到的問題。還要感謝您和Will的設計建議。我已經在競選'不爛'的設計。 – Stewbob 2010-11-19 18:43:45

0

如何檢查出來的答案here?您可能可以沿着這些方向做些什麼...

或者在設計時,您可以在代碼背後設置所有的列/行定義,也許可以?這應該擺脫所有的行......然後把xaml放回來,一旦你的設計主要分類。

3

我不知道如何關閉線路,或者即使可以,但我可以說每當我做完這類東西,無論是Win32對話框,Winforms還是WPF,我都會總是後悔像這樣堆起來的東西。

你幾乎肯定會更好地把它分解成單獨的用戶控件,以便各個'頁面'分開處理。

在我看來,箱子的問題是您真正問題的症狀,而不是問題本身。

+0

我同意我目前使用的方法不是最優的,但它是我目前所堅持的。 – Stewbob 2010-11-15 16:03:39

0

爲什麼不把每個'標籤'放在用戶控件中,那麼你可以單獨編輯它們?