C# 如何创建类对象以从其他类访问函数
编辑2:为了明确我想做什么,我创建了一个小样本项目。这是主窗口C# 如何创建类对象以从其他类访问函数,c#,wpf,C#,Wpf,编辑2:为了明确我想做什么,我创建了一个小样本项目。这是主窗口 <Grid> <StackPanel Orientation="Vertical" > <Grid Background="#FF937BFF"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"/>
<Grid>
<StackPanel Orientation="Vertical" >
<Grid Background="#FF937BFF">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Button Name="Show_Page1"
Content="Page1"
Grid.Column="0"
Margin="10 5" Click="Show_Page1_Click">
</Button>
<Button Name="Show_Page2"
Content="Page2"
Grid.ColumnSpan="1"
Margin="10 5"
Grid.Column="1" Click="Show_Page2_Click">
</Button>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Frame Height="290"
Name="MainFrame"
Grid.Column="0"
NavigationUIVisibility="Hidden"/>
<Frame Height="290"
Name="SecondFrame"
Grid.Column="1"
NavigationUIVisibility="Hidden"/>
</Grid>
</StackPanel>
</Grid>
Page1和Page2都有相同的外观。它只是一个改变文本块内容的按钮。这是我的问题。文本块本身位于另一个名为Page_other的页面上,而触发此操作的按钮位于第1页和第2页
因为我不想让这篇文章变得更长,最后的例子是Page1.cs:
public Page1()
{
InitializeComponent();
}
private void BTN_Change_TxtBlock_Click(object sender, RoutedEventArgs e)
{
// Access function to - or directly change text inside TextBlock "Name:Txt_To_Change" on "Page_Other"
}
如果希望多个类进行对话,则需要另一个类来管理此行为。(我的意思是,你可以把它们紧密地结合在一起,但这是不好的,原因有很多。) 许多程序所做的是实现一个队列。您创建了一个静态类或一个单例模式,这样每个类都可以访问它。然后将该类设置为观察者模式,以便类可以订阅和取消订阅各种事件。通过这种方式,您可以从类中发布事件,而不必确切地知道将拾取该事件并与其一起运行的内容。这使您可以灵活地交换类,而不会引起问题 以下是MessageQueue作为单例的一个示例:
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using log4net;
namespace MyApp
{
public interface IMessageQueue
{
void Subscribe(string topic, IMessageSubscriber subscriber);
void UnSubscribe(string topic, IMessageSubscriber subscriber);
void Notify(string topic, Dictionary<string, string> fields);
bool AnyoneInterested(string topic);
}
public class MessageQueue : IMessageQueue
{
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly Dictionary<string, List<IMessageSubscriber>> subscriptions =
new Dictionary<string, List<IMessageSubscriber>>();
private static MessageQueue instance;
private MessageQueue()
{
}
public static MessageQueue GetInstance()
{
return instance ?? (instance = new MessageQueue());
}
public void Subscribe(string topic, IMessageSubscriber subscriber)
{
lock (subscriptions)
{
if (subscriptions.ContainsKey(topic))
{
subscriptions[topic].Add(subscriber);
}
else
{
subscriptions.Add(topic, new List<IMessageSubscriber> {subscriber});
}
}
}
public void UnSubscribe(string topic, IMessageSubscriber subscriber)
{
lock (subscriptions)
{
if (subscriptions != null && !subscriptions.ContainsKey(topic)) return;
subscriptions[topic].Remove(subscriber);
}
}
public void Notify(string topic, Dictionary<string, string> fields)
{
lock (subscriptions)
{
if (!subscriptions.ContainsKey(topic)) return;
log.Info($"Message: {topic}");
foreach (var sub in subscriptions[topic])
{
Task.Run(() =>
{
try
{
sub.Notify(topic, fields);
}
catch
{
//supress, should only get here if someone disposed a subscriber without calling unsubscribe
}
});
}
}
}
public bool AnyoneInterested(string topic)
{
lock (subscriptions)
{
return subscriptions.ContainsKey(topic);
}
}
}
}
使用System.Collections.Generic;
运用系统反思;
使用System.Threading.Tasks;
使用log4net;
名称空间MyApp
{
公共接口IMessageQueue
{
无效订阅(字符串主题,IMessageSubscriber订阅方);
无效取消订阅(字符串主题,IMessageSubscriber subscriber subscriber);
void Notify(字符串主题、字典字段);
bool anyoneinterest(字符串主题);
}
公共类MessageQueue:IMessageQueue
{
私有静态只读ILog log=LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
专用只读词典订阅=
新字典();
私有静态消息队列实例;
私有消息队列()
{
}
公共静态MessageQueue GetInstance()
{
返回实例??(实例=newmessagequeue());
}
公共无效订阅(字符串主题,IMessageSubscriber订阅方)
{
锁定(订阅)
{
if(subscriptions.ContainsKey(主题))
{
订阅[主题]。添加(订阅服务器);
}
其他的
{
添加(主题,新列表{subscriber});
}
}
}
public void UnSubscribe(字符串主题,IMessageSubscriber订户)
{
锁定(订阅)
{
if(subscriptions!=null&&!subscriptions.ContainsKey(主题))返回;
订阅[主题]。删除(订阅服务器);
}
}
public void Notify(字符串主题、字典字段)
{
锁定(订阅)
{
if(!subscriptions.ContainsKey(主题))返回;
log.Info($“消息:{topic}”);
foreach(订阅[主题]中的var sub)
{
Task.Run(()=>
{
尝试
{
sub.Notify(主题、字段);
}
抓住
{
//Suppress,只有在有人处理了订户而没有呼叫unsubscribe时才应该到达这里
}
});
}
}
}
公共bool anyoneinterest(字符串主题)
{
锁定(订阅)
{
返回订阅。ContainsKey(主题);
}
}
}
}
以及IMessageSubscriber:
using System.Collections.Generic;
namespace MyApp
{
public interface IMessageSubscriber
{
void Notify(string topic, Dictionary<string, string> fields);
}
}
使用System.Collections.Generic;
名称空间MyApp
{
公共接口IMessageSubscriber
{
void Notify(字符串主题、字典字段);
}
}
哪个类具有您想要的功能?你能发布它的源代码吗?使用MVVM方法,让相关页面的视图模型共享和/或交换数据…我添加了另一个类@elgonzo抱歉,我(对C#)来说是个新手,所以我实际上不知道什么是MVVM。@Tom好的,所以你在某个类的某个地方创建了一个Core\u布局。哪里什么课?哪个类创建页面?哪里仅限代码。只有代码。当你描述任何东西而不是给我看代码的时候,我就不再帮你了。你想从克利夫兰的地址到辛辛那提的地址。好的,我需要三样东西:1。克利夫兰的地址;2.Cincinatti的地址;3.显示两者之间关系的地图。我不管你岳母是否住在威斯康星州的舍博伊根。我不需要听任何关于她的故事。听着,有一件事我说得非常清楚,那就是我想看看代码。也许你不确定到底是哪种代码,但你不可能错过这样一个事实:我想从你那里得到的唯一东西就是代码。你对此的本能反应是给我一个你能想到的东西,那不是代码。我不明白。我真的不知道。祝你好运。很抱歉,因为我是C#的新手,所以我真的无法跟上你。我已经更新了我的洞帖子来澄清我的问题。也许你可以帮我?谢谢
using System.Collections.Generic;
namespace MyApp
{
public interface IMessageSubscriber
{
void Notify(string topic, Dictionary<string, string> fields);
}
}