2012-08-27 12 views
9

Tôi có một thư nằm trong biên giới và được hiển thị ở phía trước khu vực máy khách MDI. Bởi vì nó chỉ là một tin nhắn, tôi đặt nó là IsHitTestVisible thành sai. Để thuận tiện, tôi cũng đã bao gồm một nút bên trong nó để người dùng có thể chỉ cần nhấp vào nút để bắt đầu một sơ đồ mới.Làm thế nào bạn có thể thiết lập IsHitTestVisible thành True trên một đứa trẻ của một cái gì đó mà nó được đặt thành false?

Tuy nhiên, do đường viền có IsHitTestVisible được đặt thành False, nó sẽ bỏ ra giá trị True của nút để người dùng không thể nhấp vào nút.

Điều đó nói rằng, làm thế nào bạn có thể điều khiển vô hình với chuột, trong khi vẫn cho phép một trong các con của nó nhận các sự kiện chuột?

Dưới đây là một ảnh chụp màn hình:

enter image description here

Chúng tôi muốn khu vực màu xanh với văn bản được hit-test vô hình, nhưng chúng tôi muốn nút để vẫn có thể được nhấn. Suy nghĩ? (Và có, tôi đã biết về xếp chồng hai mục trong một mạng lưới, nhưng điều đó messes với cách bố trí.

+1

Tôi nghĩ bạn sẽ có nhiều may mắn hơn để tìm cách sửa bố cục bằng cách sử dụng 'Grid' với hai điều khiển được xếp chồng lên nhau hơn là bạn sẽ tìm cách đặt' IsHitTestVisible = true' nhưng cho phép kiểm tra lần truy cập một mục con. Bạn có kiểu sắp xếp nào? – Rachel

+0

Bạn có thể ghi đè HitTestCore ... để xác định hành vi truy cập với UIElement của bạn (đó là giả sử bạn đã tạo UserControl) ...... nhưng giống như Rachel nói ... sử dụng Lưới hoặc bố cục khác. –

+0

Vâng, tôi đã có một kiểm soát trọng lượng nhẹ hơn nhiều được gọi là một LayerPanel mà chỉ đơn giản là ngăn xếp mọi thứ trên đầu trang của mỗi khác. Cắt bỏ tất cả các phép đo và như vậy từ Grid, vốn nổi tiếng là kém hiệu suất. Tuy nhiên, tôi ghét phải lớp mọi thứ, bởi vì sau đó khi văn bản thay đổi để bản địa hóa, nó đẩy bố cục và bây giờ bạn phải lo lắng về việc sắp xếp thứ gì đó trước cái gì đó chưa được kết nối. Không vui. Doable, nhưng không vui. – MarqueIV

Trả lời

1

Ok, không giống như câu hỏi có thể được giải quyết như được hỏi, và do đó có vẻ như chúng ta phải hoàn nguyên về phương thức xếp lớp. Trong trường hợp đó, để bù đắp cho thay đổi văn bản, bạn phải đặt căn chỉnh theo chiều dọc của nút thành Dưới cùng và đảm bảo có thêm đệm trên cạnh dưới của đường viền hoặc lề dưới trên TextBlock) để đảm bảo nhãn luôn luôn nổi phía trên nút. Bạn quản lý lề/lề bên cho cả hai bằng cách sử dụng cùng một nguyên tắc.

Điều này sẽ cung cấp cho chúng tôi những gì chúng tôi đang theo dõi, nhưng có vẻ khá cồng kềnh. Một lần nữa, tôi muốn có một số cách để xác định IsHitTestVisible (hoặc IsEnabled cho rằng vấn đề) với một 'Force' bằng cách nào đó mà tái thiết lập chúng (và dưới đây) là chủ sở hữu của các hành vi. Một người có thể mơ. Cho đến lúc đó ... lớp nó là!

+0

Thay vì mơ bạn có thể thấy câu trả lời đã chỉnh sửa của tôi :) – Erez

+0

Điều đó không thực sự trả lời câu hỏi của tôi và bạn cũng đang sử dụng IsEnabled, và có thể thay đổi giao diện điều khiển. Ngoài ra, nó yêu cầu phân lớp phụ có nghĩa là bạn không thể sử dụng nó cho các điều khiển hiện có. – MarqueIV

1

AFAIK bạn không thể . Bạn có thể làm điều đó tuy nhiên với IsEnabledProperty, và vẫn với một workaround chút. bạn phải tạo nút riêng của bạn như thế này:

Edited 2013/09/01:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("hello"); 
    } 
} 

public class MyButton : Button 
{ 
    static MyButton() 
    { 
     IsEnabledProperty.OverrideMetadata(typeof(MyButton), 
     new UIPropertyMetadata(true,(o, args) => { },(o, value) => value)); 
    } 
} 

XAML:

<BorderIsEnabled="False"> 
    <wpfApplication2:MyButton Margin="61,95,88,100" Click="ButtonBase_OnClick">Open a new diagram</wpfApplication2:MyButton> 
</Border> 
+0

Không thực sự theo dõi chính xác những gì bạn đang cố gắng hiển thị ở đây. Bạn dường như đã định nghĩa cả hai đại biểu vô danh PropertyChanged và Coercion nhưng cả hai chỉ làm hành vi mặc định, vậy tại sao chỉ định chúng ở tất cả? Và cho rằng vấn đề, bạn đặt giá trị mặc định là True, mà đã được mặc định cho IsEnabled, mà đặt ra câu hỏi tại sao bạn ghi đè siêu dữ liệu ở nơi đầu tiên?Một lần nữa, không thực sự theo dõi những gì bạn đang cố gắng để đạt được với điều này vì nó có hiệu quả xuất hiện để không thay đổi bất cứ điều gì. – MarqueIV

+0

Hành vi mặc định của IsEnabledProperty là xếp giá trị của nó từ vùng chứa cho các con của nó, một khi bạn ghi đè và bạn đặt trong parent là IsEnabled = False nó sẽ không ảnh hưởng đến đứa trẻ. – Erez

+0

Um ... nhưng bạn không thể chỉ cần thiết lập IsEnabled ở trẻ thành True mà không cần phải phân lớp cái gì? Ý tôi là nếu như bạn nói hành vi mặc định của IsEnabled là được thừa kế bởi con cái của nó, thì tất cả những gì bạn cần phải làm là đặt IsEnabled trực tiếp trên con, không có lớp con, không? – MarqueIV