C# WPF 静态全局类调用,适用与单独多页得XAML使用(适用小白)

本文介绍了C#中静态类的简单使用方法。先创建项目并添加新的xaml文件,在其中创建文本和类,添加函数和全局字符串,用子线程和委托防止线程冲突。在主窗口添加控件,通过点击按钮传输数据,还添加按钮打开控件查看数据传输情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能简介:

其实从功能上来说是比较简单得,只要你会了这一种方式,对于其他得一些调用也是没有问题,所以关于静态类是什么我就不介绍了,有不了解得大家可以去搜一下,废话不多说了,先创建一个项目。

然后点击软件上方得项目,选择添加窗口,再添加一个新的xaml文件,命名为DataBase。

在我们得DataBase.xaml窗口中创建一个文本(TextBox)命名为Name,打开DataBase.xaml.cs文件创一个类命名为NameData;

然后在我们创建得类里面添加一个函数进行外部调用,创建一个全局字符串做内部调用。并且将我们得数据也赋值给我们得文本,这里还要说的一个点就是为了防止线程冲突,我们加一个子线程和一个委托来执行我们的数据呈现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Literally
{
    /// <summary>
    /// DataBase.xaml 的交互逻辑
    /// </summary>
    public partial class DataBase : Window
    {
        public DataBase()
        {
            InitializeComponent();

            //在函数中执行数据获取
            thread_start1();
        }


        //外部调用静态类
        public static class NameData
        {
            //定义一个全局字符串进行赋值
            public static string Char = "";

            //创建一个全局函数做外部赋值调用
            public static void Name(string Data)
            {
                //将外部赋得值传给内部并且每条数据换行
                Char += Data + "\r\n";
            }

        }

        //线程委托变量定义
        Thread getDatasThread1;

        //添加一个数据获取函数
        void GetDatBase()
        {
            //一个While死循环
            while (true)
            {
                //启动线程
                new Thread(() => {
                    this.Dispatcher.Invoke(new Action(() => {

                        //将外部传入得数据赋值给我们创建得文本
                        Name.Text = NameData.Char;

                    }));
                }).Start();

                //一毫秒一执行
                Thread.Sleep(100);
            }

        }

        //委托调用
        void thread_start1()
        {
            if (getDatasThread1 != null)
            {
                try
                {
                    getDatasThread1.Abort();
                }
                catch (Exception)
                {

                }
                finally
                {
                    getDatasThread1 = null;
                }
            }

            getDatasThread1 = new Thread(new ThreadStart(GetDatBase));
            getDatasThread1.IsBackground = true;
            getDatasThread1.Start();
        }


    }
}

以上就是我们DataBase.xaml中所有代码,现在回到我们得主窗口中,添加一个Button控件和一个TextBox文本,通过点击Button控件将我们的Text文本内容传输给我们的DataBase.xaml文件中的文本中。

后端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Literally
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //我们DataBase.xaml下的全局静态类NameData中的Name函数
            DataBase.NameData.Name(Score.Text);
        }
    }
}

但是我们运行以后发现我们看不到,我们的数据是否已经传入到我们的DataBase中,所以我们需要在主窗口中再添加一个Button控件来打开我们DataBase控件。

后端所有代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Literally
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //我们DataBase.xaml下的全局静态类NameData中的Name函数
            DataBase.NameData.Name(Score.Text);
        }

        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            //打开我们的副窗口
            DataBase newForm = new DataBase();
            newForm.Show();
        }
    }
}

先点击我们的呈现再点击我们的传输就可以看到我们的数据已经通过一个全局的静态类传输过去,这就是一个简单的静态类的使用方式,当然它还可以做许多好玩的事情,这个就要看大家自己的需求了,希望能够对大家有所帮助。

<think>我们正在处理用户关于WPF中Application.Current.FindResource方法的问题。用户希望了解其用法及常见问题。根据引用内容,我们可以总结以下几点:1. Application.Current代表当前的WPF应用程序对象。2. FindResource方法用于查找资源,如果找不到会抛出异常(而TryFindResource方法在找不到时返回null)。3.资源可以定义在不同的范围:应用程序级、窗口级、控件级等。查找时按照资源查找逻辑(从当前元素向上直到应用程序资源,再到系统资源)。4.在多线程环境下,FindResource和TryFindResource是线程安全的(因为Application.Current是静态的,并且这些成员是线程安全的,见引用[4])。用户特别提到想查找资源'DayCellStyle',这很可能是一个样式资源,可能用于日历控件中的单元格。我们将分步骤回答:1.方法的基本用法2.常见问题及解决方案3.示例代码同时,根据用户要求,我们生成相关问题。</think>### C# WPF Application.Current.FindResource 用法详解 在WPF中,`Application.Current.FindResource` 是用于在应用程序级别查找资源的关键方法,其基本语法为: ```csharp object resource = Application.Current.FindResource(resourceKey); ``` #### 核心用法 1. **查找应用程序级资源** 当资源定义在`App.xaml`中时: ```xml <Application.Resources> <Style x:Key="DayCellStyle" TargetType="CalendarDayButton"> <!-- 样式定义 --> </Style> </Application.Resources> ``` 代码中调用: ```csharp Style dayStyle = Application.Current.FindResource("DayCellStyle") as Style; ``` 2. **资源查找优先级** WPF资源系统按层级查找: - 当前控件资源 → 父容器资源 → 窗口资源 → **应用程序资源**(`Application.Current.Resources`) - 最后查找系统资源[^3] 3. **线程安全性** 该方法为`static`成员且线程安全,可在多线程环境中调用[^4] #### 常见问题及解决方案 1. **资源未找到异常** ```csharp // 使用TryFindResource避免异常 var resource = Application.Current.TryFindResource("DayCellStyle"); if (resource == null) { // 处理资源缺失 } ``` 2. **资源作用域错误** - 问题:资源定义在特定窗口/控件内,但用`Application.Current`查找 - 解决方案: ```csharp // 正确从控件层级查找 var localResource = myGrid.FindResource("DayCellStyle"); ``` 3. **资源加载时机** - 在`Application.Startup`事件前调用会导致空引用 - 应在窗体加载事件中调用资源查找[^2] 4. **资源类型转换错误** ```csharp // 安全类型转换 if (Application.Current.FindResource("DayCellStyle") is Style style) { myCalendar.DayButtonStyle = style; } ``` #### 完整示例 ```csharp // 获取应用程序资源并应用 private void ApplyCalendarStyle() { var dayCellStyle = Application.Current.FindResource("DayCellStyle") as Style; if (dayCellStyle != null) { myCalendar.DayButtonStyle = dayCellStyle; } else { MessageBox.Show("DayCellStyle资源未找到"); } } ``` > **关键点**:当资源定义在`App.xaml`且需全局访问时使用`Application.Current.FindResource`,局部资源应使用控件级`FindResource`[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值