Ở nơi làm việc, tôi có nhiều trang, mỗi trang có các nút ở cùng một vị trí và với cùng các thuộc tính. Mỗi trang cũng có những khác biệt nhỏ. Để kết thúc, chúng tôi tạo ra một userControl Template và đặt tất cả các nút trong đó, sau đó áp dụng điều khiển người dùng đó cho tất cả các trang. Tuy nhiên, bây giờ nó là khá khó khăn để truy cập các nút và sửa đổi chúng từ xaml của mỗi trang, bởi vì họ đang ở trong một UserControl trên trang ..... Làm thế nào để tôi truy cập trang nhã các nút từ mỗi trang?Làm cách nào để truy cập các nút bên trong UserControl từ xaml?
Những gì tôi đã cố gắng:
Hiện nay, chúng tôi liên kết với một loạt các thuộc tính phụ thuộc. Tôi không thích tùy chọn này vì tôi có nhiều nút và cần phải kiểm soát nhiều thuộc tính trên các nút đó. Kết quả là hàng trăm thuộc tính phụ thuộc, và một mớ hỗn độn thực sự để lội qua khi chúng ta cần phải thay đổi một cái gì đó.
Phương pháp khác là sử dụng kiểu. Tôi thích phương pháp này nói chung, nhưng vì các nút này nằm bên trong một điều khiển khác nên việc sửa đổi chúng trở nên khó khăn và mẫu sẽ chỉ chính xác cho một nút, cùng một lúc.
Adam Kemp đăng về việc cho phép người dùng chỉ cần chèn nút riêng của họ here và đây là phương pháp tôi hiện đang cố gắng cấy ghép/sửa đổi. Thật không may, tôi không có quyền truy cập vào Xamarin.
Mặc dù mẫu là chèn khi mã chạy, mẫu không cập nhật nút một cách chính xác. Nếu tôi đặt điểm ngắt trong MyButton Setter, tôi có thể thấy rằng giá trị thực sự là một nút trống, thay vì nút tôi đã chỉ định trong cửa sổ chính của mình. Làm thế nào để sửa lỗi này?
Dưới đây là một số luật đơn giản:
My Template UserControl của XAML:
<UserControl x:Class="TemplateCode.Template"
x:Name="TemplatePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="350"
d:DesignWidth="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Background="DarkGray">
<Grid>
<Button x:Name="_button" Width="200" Height="100" Content="Template Button"/>
</Grid>
</UserControl>
My Template UserControl của Mã Đằng sau:
using System.Windows.Controls;
namespace TemplateCode
{
public partial class Template : UserControl
{
public static Button DefaultButton;
public Template()
{
InitializeComponent();
}
public Button MyButton
{
get
{
return _button;
}
set
{
_button = value; //I get here, but value is a blank button?!
// Eventually, I'd like to do something like:
// Foreach (property in value)
// {
// If(value.property != DefaultButton.property))
// {
// _button.property = value.property;
// }
// }
// This way users only have to update some of the properties
}
}
}
}
Và bây giờ các ứng dụng mà tôi muốn sử dụng nó:
<Window x:Class="TemplateCode.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:templateCode="clr-namespace:TemplateCode"
Title="MainWindow"
Height="350"
Width="525"
Background="LimeGreen"
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<Grid>
<templateCode:Template>
<templateCode:Template.MyButton>
<Button Background="Yellow"
Content="Actual Button"
Width="200"
Height="100"/>
</templateCode:Template.MyButton>
</templateCode:Template>
</Grid>
</Window>
Và Bây giờ Mã Đằng sau:
Using System.Windows;
Namespace TemplateCode
{
Public partial class MainWindow : Window
{
Public MainWindow()
{
InitializeComponent();
}
}
}
Edit: Trong khi tôi muốn loại bỏ các thuộc tính phụ thuộc không cần thiết trong mẫu UserControl, tôi vẫn muốn thiết lập các ràng buộc trên thuộc tính nút 's từ XAML.
Bạn cũng có thể tạo một ObservableCollection và đăng ký nó dưới dạng DependencyProperty. Sau đó truy cập nó bằng một bộ chỉ mục. Nếu không, hãy thử giải pháp với một kiểu, http://stackoverflow.com/questions/40015997/c-sharp-wpf-style-control-in-usercontrol –
"Vì các nút này nằm trong một điều khiển khác nên sẽ khó sửa đổi chúng" : Bạn có thể làm rõ? Một thuộc tính cho mỗi nút và người tiêu dùng có toàn quyền kiểm soát. Nếu bạn muốn chia sẻ kiểu, trong khi sử dụng các mẫu khác nhau cho mỗi nút, bạn cũng có thể có thuộc tính mẫu cho mỗi nút. Hoặc chỉ cần sử dụng Style.BasedOn rất nhiều. –