2009-08-24 30 views
23

Tôi có một hình thức WPF mà về cơ bản trông như thế này:yếu tố Ẩn WPF trong Visual Studio thiết kế

<Window ...> 
    <Grid> 
    <DockPanel> 
     [content shown during normal operation] 
    </DockPanel> 

    <Grid Background="#CCCC" Visibility="Hidden"> 
     [overlay grid which is only shown during special circumstances] 
    </Grid> 
    </Grid> 
</Window> 

Lưới che phủ giấu mọi thứ khác (tức là "nội dung bình thường") và chỉ được thể hiện trong những trường hợp đặc biệt (tức là nếu kết nối mạng bị ngắt). Điều này hoạt động hoàn toàn tốt khi chạy chương trình.

Hiện tại, ở chế độ thiết kế, vấn đề là Visual Studio bỏ qua Visibility="Hidden". Thông thường, điều này làm cho cảm giác hoàn hảo (sau khi tất cả, tôi muốn có thể chỉnh sửa các yếu tố UI ẩn), nhưng trong trường hợp của tôi nó gây phiền nhiễu, bởi vì nó ngăn cản tôi chỉnh sửa các công cụ trong DockPanel trong thiết kế.

Vì vậy, những gì tôi muốn làm là một cái gì đó như thế:

<Grid Background="#CCCC" Visibility="Hidden" VS.ShowInDesigner="False"> 
    [overlay grid which is only shown during special circumstances] 
</Grid> 

Nhưng, than ôi, không có tài sản đó, hoặc ít nhất là không có mà tôi biết. Bất kỳ ý tưởng?

+1

Tôi đang đi về một giải pháp theo một cách khác nhau trong đó tôi đang cố gắng tìm ra cách TabControl đạt được điều này. Với TabControl, bạn có thể thiết lập một tab cụ thể được chọn nhưng bên trong trình thiết kế, nó sẽ bỏ qua điều này nếu bạn đặt con trỏ trong mã cho một trong các tab hoặc trên các tab thực trong trình thiết kế và thay vào đó hiển thị tab được chọn theo thời gian thiết kế . Tôi nghĩ rằng điều khiển Popup nên làm việc theo cùng một cách và tôi đang làm việc trên một cái gì đó tương tự như kiểm soát Childlight Childlighting mà sẽ cho tôi loại hành vi thời gian thiết kế. – jpierson

Trả lời

11

Giải pháp tốt, tôi gặp sự cố tương tự và tôi đồng ý rằng có những trường hợp cần thiết. Đây là một bản cập nhật nhỏ cho phép bạn chỉnh sửa giá trị để bật và tắt IsHidden trong khi thiết kế. Tôi cũng đã áp dụng ScaleTransform thay vì thiết lập Width và Height để giảm hiện vật màn hình một chút nếu control grips được hiển thị và tránh xung đột nếu control bị ẩn đã có thuộc tính Width và Height (giả sử rằng điều khiển chưa có LayoutTransform được đặt trên nó).

Public Class DesignModeTool 

    Public Shared ReadOnly IsHiddenProperty As DependencyProperty = DependencyProperty.RegisterAttached(_ 
    "IsHidden", GetType(Boolean), GetType(DesignModeTool), _ 
    New FrameworkPropertyMetadata(False, New PropertyChangedCallback(AddressOf OnIsHiddenChanged))) 

    Public Shared Sub SetIsHidden(ByVal element As FrameworkElement, ByVal value As Boolean) 
    element.SetValue(IsHiddenProperty, value) 
    End Sub 

    Public Shared Function GetIsHidden(ByVal element As FrameworkElement) As Boolean 
    Return DirectCast(element.GetValue(IsHiddenProperty), Boolean) 
    End Function 

    Private Shared Sub OnIsHiddenChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
    If System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso True.Equals(e.NewValue) Then 
     With DirectCast(d, FrameworkElement) 
     .LayoutTransform = New ScaleTransform(0.001, 0.001) 
     End With 
    ElseIf System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso False.Equals(e.NewValue) Then 
     With DirectCast(d, FrameworkElement) 
     .LayoutTransform = Nothing 
     End With 
    End If 
    End Sub 
End Class 
+0

+1. Phần mở rộng tốt đẹp, cảm ơn bạn đã chia sẻ! – Heinzi

+0

Điều này đã giúp ích rất nhiều. Tôi thích mã như thế này, nơi tôi có thể học hỏi. Cảm ơn bạn. – MikeMalter

+4

+1 Rất tốt! Nhưng tôi cần một VB để C# dịch ;-) – Jim

3

Khác với việc không sử dụng nhà thiết kế (thực sự, hãy cân nhắc điều này), bạn có thể tách các nội dung của Grid thành UserControl riêng biệt. Bằng cách đó, bạn chỉ có thể cập nhật UserControl cách ly khỏi logic hiển thị.

+1

Giới thiệu về cách sử dụng nhà thiết kế: Có, tôi biết ý bạn là gì. Tôi chỉ sử dụng trình thiết kế để điều hướng (nhấp vào điều khiển và trình chỉnh sửa nhảy tới mã XAML). Tuy nhiên, đây là một tính năng rất quan trọng đối với các tệp XAML lớn. – Heinzi

7

vì không có built-in cách để làm điều này, tôi quyết định thực hiện một giải pháp bản thân mình, đó là đáng ngạc nhiên dễ dàng để làm bằng tài sản gắn liền:

Public Class DesignModeTool 
    Public Shared ReadOnly IsHiddenProperty As DependencyProperty = DependencyProperty.RegisterAttached(_ 
     "IsHidden", GetType(Boolean), GetType(DesignModeTool), _ 
     New FrameworkPropertyMetadata(False, New PropertyChangedCallback(AddressOf OnIsHiddenChanged))) 

    Public Shared Sub SetIsHidden(ByVal element As UIElement, ByVal value As Boolean) 
     element.SetValue(IsHiddenProperty, value) 
    End Sub 

    Public Shared Function GetIsHidden(ByVal element As UIElement) As Boolean 
     Return DirectCast(element.GetValue(IsHiddenProperty), Boolean) 
    End Function 

    Private Shared Sub OnIsHiddenChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     If System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso True.Equals(e.NewValue) Then 
      With DirectCast(d, FrameworkElement) 
       .Width = 0 
       .Height = 0 
      End With 
     End If 
    End Sub 
End Class 

Sau khi tuyên bố một không gian tên, tính năng có thể được sử dụng như thế này:

<Grid ... local:DesignModeTool.IsHidden="True"> 
[stuff I don't want to be shown in the designer] 
</Grid> 
+0

Điều này rất hữu ích. Cảm ơn bạn. – MikeMalter

2

Gần đây tôi đã gặp sự cố tương tự.

Tôi đang sử dụng Hình chữ nhật để che khuất cửa sổ chính trong khi thực hiện hộp thoại của phương thức. Tôi có các dữ liệu Visibility bị ràng buộc, nhưng hình chữ nhật làm cho các nhà thiết kế không sử dụng được. Tôi điên chỉ mục Z một ràng buộc dữ liệu một lần, và một giá trị dự phòng thấp hơn cửa sổ tôi muốn che khuất. Khi ứng dụng khởi động, chỉ số Z của Hình chữ nhật được gắn với giá trị cao hơn cửa sổ.

7

Làm tốt lắm! Tôi dịch sang C# và thay đổi thuộc tính mà nó thay đổi thành RenderTransform.

static class DesignModeTool 
{ 
    public static readonly DependencyProperty IsHiddenProperty = 
     DependencyProperty.RegisterAttached("IsHidden", 
      typeof(bool), 
      typeof(DesignModeTool), 
      new FrameworkPropertyMetadata(false, 
       new PropertyChangedCallback(OnIsHiddenChanged))); 

    public static void SetIsHidden(FrameworkElement element, bool value) 
    { 
     element.SetValue(IsHiddenProperty, value); 
    } 

    public static bool GetIsHidden(FrameworkElement element) 
    { 
     return (bool)element.GetValue(IsHiddenProperty); 
    } 

    private static void OnIsHiddenChanged(DependencyObject d, 
              DependencyPropertyChangedEventArgs e) 
    { 
     if (!DesignerProperties.GetIsInDesignMode(d)) return; 
     var element = (FrameworkElement)d; 
     element.RenderTransform = (bool)e.NewValue 
      ? new ScaleTransform(0, 0) 
      : null; 
    } 
} 
1

Tôi đang ở phía bên kia ... ghét VS 2012 để ẩn các điều khiển WPF ẩn trong thiết kế. Tôi cần phải nhìn thấy chúng vì vậy tôi đã đổi mã gregsdennis tới:

public class DesignModeTool 
{ 
    public static readonly DependencyProperty IsHiddenProperty = DependencyProperty.RegisterAttached("IsHidden", typeof(bool), typeof(DesignModeTool), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsHiddenChanged))); 

    public static void SetIsHidden(FrameworkElement element, bool value) 
    { 
     element.SetValue(IsHiddenProperty, value); 
    } 

    public static bool GetIsHidden(FrameworkElement element) 
    { 
     return (bool)element.GetValue(IsHiddenProperty); 
    } 

    private static void OnIsHiddenChanged(DependencyObject d, 
              DependencyPropertyChangedEventArgs e) 
    { 
     if (!DesignerProperties.GetIsInDesignMode(d)) return; 
     var element = (FrameworkElement)d; 
     element.Visibility=Visibility.Visible; 

    } 
} 

wpfClasses2: DesignModeTool.IsHidden = "False" sẽ hiển thị điều khiển trong chế độ thiết kế.

53

Bắt đầu từ VS2012 bạn chỉ có thể sử dụng không gian tên Blend Được ẩn thuộc tính:

  • thêm nếu chưa có mặt xmlns: d = "http://schemas.microsoft.com/expression/blend/2008"
  • đặt d: được ẩn = "true" trên yếu tố mà bạn muốn ẩn lúc thiết kế chỉ
+6

Điều này nên được đánh dấu là câu trả lời –

+0

Không hoạt động cùng với thuộc tính Visibility. Khả năng hiển thị dường như có mức độ ưu tiên. Và tôi đoán không có d: Hiển thị: ( – Edgar

+0

Cool! Trong VS2017, các xmlns pha trộn đã có sẵn, nhưng giải pháp này vẫn không hoạt động ("Thuộc tính" IsHidden "không tồn tại trong pha trộn ...") .Tôi phải tìm kiếm để biết thêm thông tin và phát hiện ra, rằng sau dòng có chứa ** xmlns: d = "http://schemas.microsoft.com/expression/blend/2008" ** , bạn cần bao gồm hai dòng khác: ** xmlns: mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorable = "d" ** Sau đó, thuộc tính IsHidden hoạt động hoàn hảo. (Xin lỗi, định dạng bị giới hạn ở đây) –

0

trên thực tế drongal tôi đã phải thiết lập DesignModeTool.IsHidden = "tRUE" để làm cho nó hiển thị phần ẩn của tôi về UserControl của tôi.

Các vấn đề liên quan