Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建类对象以从其他类访问函数_C#_Wpf - Fatal编程技术网

C# 如何创建类对象以从其他类访问函数

C# 如何创建类对象以从其他类访问函数,c#,wpf,C#,Wpf,编辑2:为了明确我想做什么,我创建了一个小样本项目。这是主窗口 <Grid> <StackPanel Orientation="Vertical" > <Grid Background="#FF937BFF"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"/>

编辑2:为了明确我想做什么,我创建了一个小样本项目。这是主窗口

    <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);
    }
}