我想在C#中學習屬性(獲取和設置)。我仍然對這門語言很陌生,目前正在製作一個使用WPF和一些文本框的簡單程序,如圖所示。如何將屬性(get; set;)分配給WPF用戶控件?
所以,這裏有介紹:
- 輸入:這是在那裏用戶可以鍵入輸入,位於主窗口
- 輸出1:這是在哪裏看到在輸入的輸入字符串,位於主窗口
- 輸出2:與輸出1相同,位於主窗口中的選項卡1內。
- 輸出3:與輸出1相同,位於選項卡2內部,仍位於MainWindow。
- 輸出4:與輸出1相同,位於標籤2內部,稱爲本地UserControl Page1。
- 按鈕:一個按鈕 「保存」 輸入
下面是代碼: 主窗口:溶液 - >我local:page1
<!-- MainWindow.xaml -->
<Window x:Class="TestGetSet.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestGetSet"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="212" Margin="37,20,0,0" VerticalAlignment="Top" Width="447">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5">
<TextBox x:Name="output2" HorizontalAlignment="Left" Height="23" Margin="156,76,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
<Label x:Name="label2" Content="Output 2" HorizontalAlignment="Left" Margin="156,46,0,0" VerticalAlignment="Top"/>
</Grid>
</TabItem>
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5">
<TextBox x:Name="output3" HorizontalAlignment="Left" Height="23" Margin="321,26,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
<local:Page1 x:Name="Page1"/>
<Label x:Name="label3" Content="Output 3" HorizontalAlignment="Left" Margin="321,0,0,0" VerticalAlignment="Top"/>
</Grid>
</TabItem>
</TabControl>
<TextBox x:Name="input" Text=""/>
<TextBox x:Name="output1" Text=""/>
<Button x:Name="button" Content="Button" Click="button_Click"/>
<Label x:Name="label" Content="Input" HorizontalAlignment="Left" Margin="37,239,0,0" VerticalAlignment="Top"/>
<Label x:Name="label1" Content="Output 1" HorizontalAlignment="Left" Margin="364,239,0,0" VerticalAlignment="Top"/>
</Grid>
之後加入x:Name="Page1"
主窗口後面的代碼:溶液 - - >添加一行Page1.passingvalue(..)
// MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
public partial class MainWindow : Window
{
public myProperty myProp = new myProperty();
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
myProp.myData = input.Text;
output1.Text = myProp.myData;
output2.Text = myProp.myData;
output3.Text = myProp.myData;
Page1.passingvalue(myProp.myData);
}
}
下一步是的Page1.xaml(沒有變化中號ADE這裏的解決方案)
<!-- Page1.xaml-->
<UserControl x:Class="TestGetSet.Page1"
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"
xmlns:local="clr-namespace:TestGetSet"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox x:Name="output4" Text=""/>
<Label x:Name="label" Content="Output 4" HorizontalAlignment="Left" Margin="92,110,0,0" VerticalAlignment="Top"/>
</Grid>
</UserControl>
第1頁後面的代碼:解決方案 - >刪除計時器,並添加passingvalue
// Page1.xaml.cs
using System;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Threading;
using System.ComponentModel;
namespace TestGetSet
{
public partial class Page1 : UserControl
{
private Thread _receiveThread;
myProperty myProp = new myProperty();
public Page1()
{
InitializeComponent();
/*DispatcherTimer MyTimer = new DispatcherTimer();
MyTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);
MyTimer.Tick += MyTimer_Tick;
MyTimer.Start();*/
}
public void passingvalue(string m)
{
output4.Text = m;
}
/*private void MyTimer_Tick(object sender, EventArgs e)
{
output4.Text = myProp.myData;
}*/
}
}
最後一個,屬性,簡單的版本:
// myProperty.cs
namespace TestGetSet
{
public class myProperty
{
public string myData { get; set }
}
}
物業與INotifyPropertyChanged:
// myProperty.cs
using System.ComponentModel;
namespace TestGetSet
{
public class myProperty : INotifyPropertyChanged
{
private string _textdata;
public string myData {
get
{
return _textdata;
}
set
{
_textdata = value;
NotifyPropertyChanged("myData");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
正如你所看到的,只有輸出4是空的,其他輸出仍然給我的結果,即使我不使用INotifyPropertyChanged的。我的問題是爲什麼,我該如何解決這個問題?我想知道是不是因爲我正在使用UserControl來處理Output4所在的Page1頁。我一直在尋找答案,但沒有提供任何內容。任何幫助深表感謝。謝謝。
好吧,我更新了代碼。現在正在工作。我從passingvalue
獲得參考:How to Pass a Value From a Window to a UserControl in WPF
謝謝。
提供整個XAML,以便它看起來完全像你的形象。沒有人會費心在你的代碼中添加缺失的部分。 –
頁面1的代碼隱藏內部定義的屬性'myprop'是類'myProperty'的新實例,因此它是空的。在MainWindow和Page1中定義的類型爲myProperty的屬性是具有相同名稱的兩個屬性,但是是同一類的不同實例。如果你想「分享」mainwindow和page1之間的屬性,你應該考慮使用數據綁定https://msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx。 – CiccioRocca
@NareshRavlani整個代碼已被添加。抱歉。 –