wpf如何在c#代码里引用xaml里定义好的样式?

Object ob1 = FindResource("button1");
btn[k].Style = (Style)ob1;
但是调试的时候就出错了,说“未将对象引用设置到对象实例”
请问正确的用法是什么?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:C# WPF 静态全局类调用,适用与单独多页得XAML使用(适用小白)
  • 除此之外, 这篇博客: C# WPF 静态全局类调用,适用与单独多页得XAML使用(适用小白)中的 功能简介: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

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

    然后点击软件上方得项目,选择添加窗口,再添加一个新的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();
            }
        }
    }
    

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


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^