小编Eri*_*ric的帖子

没有.xaml.cs代码的XAML文件

我正在使用带有Model-View-ViewModel模式的WPF.因此,我的代码隐藏文件(.xaml.cs)都是空的,除了调用InitializeComponent的构造函数.因此,对于每个.xaml文件,我都有一个匹配的,无用的.xaml.cs文件.

我发誓我读到某个地方,如果文件后面的代码是空的,除了构造函数,有一种方法可以从项目中删除该文件.在搜索网络后,似乎适当的方法是使用'x:Subclass'属性:

<UserControl
    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"
    mc:Ignorable="d"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    x:Class="MyNamespace.MyClass"
    x:Subclass="UserControl"
    d:DesignWidth="700" d:DesignHeight="500">
Run Code Online (Sandbox Code Playgroud)

这将在生成的.g.cs文件中执行以下操作:

  1. 删除MyClass上的"部分"类修饰符.
  2. 将类"UserControl"添加到其子类列表中.

似乎很完美.实际上,如果你在构建中仍然有.xaml.cs文件,它会因为缺少部分而不再编译 - 所以我认为这必须是正确的.但是,如果我从构建中删除多余的文件并运行,则控件不会正确初始化(它是空白的).我认为这是因为没有调用InitializeComponent().我看到InitializeComponent不是虚拟的,所以基类似乎没有办法调用它(没有使用反射).

我错过了什么吗?

谢谢!

埃里克

wpf xaml code-behind mvvm

26
推荐指数
2
解决办法
1万
查看次数

使用XElement时如何输入文本

我正在使用新的System.Xml.Linq来创建HTML文档(是的,我知道HtmlDocument,但更喜欢XDocument/XElement类).我在插入&nbsp;(或任何其他HTML实体)时遇到问题.我已经尝试过了:

  1. 只是直接放入文本不起作用,因为&转换为int&. new XElement("h1", "Text&nbsp;to&nbsp;keep&nbsp;together.");

  2. 我尝试使用以下内容在原始XML中进行解析,但是barfs出现此错误:

    XElement.Parse("文字保持在一起.");

    - >引用未声明的实体'nbsp'

  3. 尝试编号三如下所示.如果我保存到文件中,只有一个空格,&#160;就会丢失.


var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!")));
private static XNode KeepTogether(string p)`
{
    return XElement.Parse("<xml>" + p.Replace(" ", "&#160;") + "</xml>").FirstNode;
}
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法只是将原始文本推送过去而不会被转义.我错过了一些明显的东西吗

html c# linq

14
推荐指数
1
解决办法
8488
查看次数

我可以将DataContractSerializer配置为不在输出XML中创建可选(即Nullable <>和List <>)元素吗?

我正在使用新的.NET 3.0 DataContractSerializer.我有Nullable < >和List < >对象我要序列化.例:

[DataContract(Namespace = "")]
class Test
{
    public static void Go()
    {
        Test test = new Test();

        var dcs = new DataContractSerializer(typeof(Test));
        dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test);
    }

    [DataMember]
    public Nullable<int> NullableNumber = null;

    [DataMember]
    public int Number = 5;

    [DataMember]
    public List<int> Numbers = new List<int>();
}
Run Code Online (Sandbox Code Playgroud)

当.NET序列化空列表或空列表时,它将nil(对于Nullable)和空(对于列表)元素放入XML中.上面的例子生成:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <NullableNumber i:nil="true"/>
  <Number>5</Number>
  <Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</Test>
Run Code Online (Sandbox Code Playgroud)

由于我没有时间描述的原因,我想消除多余的NullableNumber和Numbers元素,如下所示:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)

实际上,上面的文件反序列化了串行器就好了.

谢谢你的帮助!

.net c# datacontractserializer

13
推荐指数
1
解决办法
8361
查看次数

实现IXmlSerializable时,如何只覆盖ReadXml或WriteXml而不是两者?

我想在类上实现IXmlSerializable,只覆盖ReadXml或WriteXml,但不能同时覆盖两者.如果我没有在这个类上实现IXMLSerializable,XMLSerializer会自动序列化所有成员.我希望该默认行为适用于未覆盖的案例.但是,由于IXmlSerializable是一个接口,而不是基类,我不知道该怎么做.

另外,在一种情况下,我需要执行默认行为,并在完成时添加一些额外的代码.所以,我想覆盖并回调'基础'类行为.同样,如果有一个基类,这将是微不足道的,但由于这是一个接口,因此不是那么微不足道.

谢谢!

.net c# xml serialization

11
推荐指数
1
解决办法
3657
查看次数

将ISerializable与DataContractSerializer一起使用时,如何阻止序列化程序输出类型信息?

为了更好地控制序列化,我将一个类从[DataContract]转换为[Serializable],实现了GetObjectData和特殊的反序列化构造函数.当我这样做时,现在发出的XML具有应用于所有元素的类型信息.我不想要这些多余的信息,我想知道如何通知序列化程序不输出它.

以下是使用[DataContract]的示例代码:

[DataContract(Namespace = "")]
class Test 
{
    public Test() { }
    [DataMember]
    public Nullable<int> NullableNumber = 7;
    [DataMember]
    public int Number = 5;

    public static void Go()
    {
        var test = new Test();
        var dcs = new DataContractSerializer(typeof(Test));
        using (var s = new StreamWriter("test.xml"))
        {
            dcs.WriteObject(s.BaseStream, test);
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

这将输出以下XML(请注意Nullable Number和Number上没有类型信息 - 这是所需的输出):

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <NullableNumber>7</NullableNumber>
  <Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)

如果我修改上面的代码如下(添加[Serializable],:ISerializable和两个序列化方法):

[Serializable]
class Test : ISerializable
{
    public Test() { }
    public Nullable<int> NullableNumber = 7;
    public int Number = …
Run Code Online (Sandbox Code Playgroud)

.net c# xml serializable datacontractserializer

11
推荐指数
1
解决办法
3450
查看次数

有没有办法在C#中进行动态隐式类型转换?

给定此类具有隐式转换运算符:

public class MyDateTime
{
    public static implicit operator MyDateTime(System.Int64 encoded)
    {
        return new MyDateTime(encoded);
    }

    public MyDateTime(System.Int64 encoded)
    {
        _encoded = encoded;
    }
    System.Int64 _encoded;
}
Run Code Online (Sandbox Code Playgroud)

我现在可以做以下事情:

long a = 5;
MyDateTime b = a;
Run Code Online (Sandbox Code Playgroud)

但不是以下内容:

long f = 5;
object g = f;
MyDateTime h = g;
Run Code Online (Sandbox Code Playgroud)

这给出了编译时间:

无法将类型'object'隐式转换为'MyDateTime'.

我感觉合理.

现在我修改前面的例子如下:

long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
Run Code Online (Sandbox Code Playgroud)

编译好了.现在我得到一个运行时InvalidCastException:

无法将"System.Int64"类型的对象强制转换为"MyDateTime"类型.

这告诉我C#隐式转换运算符仅在编译时应用,并且在.NET运行时试图将对象动态转换为另一种类型时不应用.

我的问题:

  1. 我对么?
  2. 还有其他方法可以做到这一点吗?

顺便说一句,完整的应用程序是我Delegate.DynamicInvoke()用来调用一个带MyDateTime参数的函数,而我传递给的参数的类型很DynamicInvoke长.

c# dynamic-cast type-conversion implicit-cast dynamic-invoke

11
推荐指数
1
解决办法
2949
查看次数

使用WeakReference解决.NET未注册事件处理程序导致内存泄漏的问题

问题:已注册的事件处理程序创建从事件到事件处理程序实例的引用.如果该实例未能注销事件处理程序(通过Dispose,可能),那么垃圾收集器将不会释放实例内存.

例:

    class Foo
    {
        public event Action AnEvent;
        public void DoEvent()
        {
            if (AnEvent != null)
                AnEvent();
        }
    }        
    class Bar
    {
        public Bar(Foo l)
        {
            l.AnEvent += l_AnEvent;
        }

        void l_AnEvent()
        {

        }            
    }
Run Code Online (Sandbox Code Playgroud)

如果我实例化一个Foo,并将其传递给一个新的Bar构造函数,然后放开Bar对象,由于AnEvent注册,垃圾收集器不会释放它.

我认为这是一个内存泄漏,看起来就像我的旧C++时代.当然,我可以使Bar IDisposable,在Dispose()方法中取消注册事件,并确保在它的实例上调用Dispose(),但为什么我必须这样做?

我首先质疑为什么事件是通过强引用来实现的?为什么不使用弱引用?事件用于抽象地通知对象另一个对象的更改.在我看来,如果事件处理程序的实例不再使用(即,没有对该对象的非事件引用),那么它注册的任何事件都应该自动取消注册.我错过了什么?

我看过WeakEventManager.哇,多么痛苦.它不仅使用起来非常困难,而且其文档也不充分(请参阅http://msdn.microsoft.com/en-us/library/system.windows.weakeventmanager.aspx - 注意到"对继承者的说明"部分,有6个模糊的子弹).

我在各个地方看过其他讨论,但我觉得我无法使用.我提出了一个基于WeakReference的简单解决方案,如此处所述.我的问题是:这是否不符合要求,复杂性显着降低?

要使用该解决方案,上面的代码修改如下:

    class Foo
    {
        public WeakReferenceEvent AnEvent = new WeakReferenceEvent();

        internal void DoEvent()
        {
            AnEvent.Invoke();
        }
    }

    class Bar
    {
        public Bar(Foo l)
        {
            l.AnEvent += l_AnEvent;
        }

        void l_AnEvent()
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

注意两件事:1.Foo类以两种方式修改:事件被WeakReferenceEvent实例替换,如下所示; 并且更改了事件的调用.2. …

.net c# events garbage-collection memory-leaks

11
推荐指数
1
解决办法
2696
查看次数

如何在Linux上设置最大TCP最大段大小?

在Linux中,如何设置TCP连接上允许的最大段大小?我需要为我没写的应用程序设置它(所以我不能用setsockopt它来做).我需要将此设置为网络堆栈中的mtu.

我有两个流共享相同的网络连接.一个周期性地发送小数据包,这需要绝对最小延迟.另一个发送大量数据 - 我正在使用SCP来模拟该链接.

我已设置流量控制(tc)以使最小延迟流量具有高优先级.但是,我遇到的问题是,从SCP下来的TCP数据包最终会出现64K字节的大小.是的,这些基于mtu被分成更小的数据包,但遗憾的是,在tc对数据包进行优先级排序之后.因此,我的低延迟数据包被卡在高达64K字节的SCP流量后面.

本文指出在Windows上您可以设置此值.

我可以在Linux上设置一些东西吗?我尝试过ip route和iptables,但这些在网络堆栈中应用得太低了.我需要在tc之前限制TCP数据包大小,因此它可以适当地优先处理高优先级数据包.

linux qos tcp

7
推荐指数
3
解决办法
3万
查看次数

WPF绑定到Model对象列表的ViewModel列表

在模型中,我有:

public ObservableCollection<Item> Items { get; private set; }
Run Code Online (Sandbox Code Playgroud)

在ViewModel中,我有一个相应的ItemViewModel列表.我希望这个列表与模型列表双向绑定:

public ObservableCollection<ItemViewModel> ItemViewModels ...
Run Code Online (Sandbox Code Playgroud)

在XAML中,我将绑定(在本例中为TreeView)到ItemViewModels属性.

我的问题是,上面显示的ViewModel中的"..."是什么?我希望一行或两行代码绑定这两个ObservableCollections(提供为每个模型对象构造的ViewModel的类型).但是,我担心的是需要一堆代码来处理Items.CollectionChanged事件并通过根据需要构建ViewModel来手动更新ItemViewModels列表,以及相应的相反方法,它将根据对ItemViewModel的更改来更新Items集合.

谢谢!

埃里克

c# wpf xaml observablecollection mvvm

2
推荐指数
1
解决办法
3074
查看次数