小编Car*_*arl的帖子

在MultiDataTrigger中组合DataTrigger和Trigger

我从一些例子中看到,可以结合这种触发器:

<Trigger Property="IsMouseOver" Value="True">
Run Code Online (Sandbox Code Playgroud)

有了这种数据触发器:

<DataTrigger Binding="{Binding IsHighlightable}" Value="True" />
Run Code Online (Sandbox Code Playgroud)

通过使用这样的MultiDataTrigger:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
        <Condition Binding="{Binding IsHighlightable}" Value="True" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="BorderBrush" Value="#BF6DBDD1"/>
        <Setter Property="Background" Value="{StaticResource SelectedItemBackgroundBrush}"/>
    </MultiDataTrigger.Setters>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于附加属性.此触发器有效:

<Trigger Property="UI:TreeViewHelper.IsMouseDirectlyOverItem" Value="True">
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=UI:TreeViewHelper.IsMouseDirectlyOverItem}" Value="True"/>
        <Condition Binding="{Binding IsHighlightable}" Value="True" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="BorderBrush" Value="#BF6DBDD1"/>
        <Setter Property="Background" Value="{StaticResource SelectedItemBackgroundBrush}"/>
    </MultiDataTrigger.Setters>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)

有没有办法让触发器在MultiDataTrigger中正常工作?IsMouseDirectlyOverItem属性取自http://blogs.msdn.com/b/mikehillberg/archive/2006/09/21/mytreeviewhelperismousedirectlyoveritem.aspx.

谢谢

data-binding wpf xaml triggers

22
推荐指数
2
解决办法
9655
查看次数

如何告诉NHibernate触发器更新另一个表?

我在使用NHibernate时遇到了一个TooManyRowsAffectedException,我通过注入一个不同的批处理程序(如带有加密触发器的TooManyRowsAffectedException)或者通过修改数据库中的触发器来使用SET NOCOUNT ON(我不能使用这个因为我不想修改数据库 - 它非常复杂,有超过一百个表都相关在一起,我不想乱用它,因为其他应用程序使用它).我不明白的是为什么会发生这种异常.我所做的就是我有一个Sample对象,它有几个值我检查,如果值符合给定的条件,我将Sample.IsDone行设置为'Y'(在我们的数据库中,所有布尔值都由一个char Y或N).代码很简单:

IQueryable<Sample> samples = session.Query<Sample>().Where(s =­­> s.Value == desiredValue);
foreach (Sample sample in samples)
{
  sample.IsDone = 'Y';
  session.Flush(); // Throws TooManyRowsAffectedException
}
session.Flush(); // Throws TooManyRowsAffectedException
Run Code Online (Sandbox Code Playgroud)

Flush调用抛出我是把它放在循环内还是外面.有什么我做错了或者它只与数据库的制作方式有关吗?我尝试在Flush()之前调用样本上的SaveOrUpdate(),但它没有改变任何东西.我知道我可以解决这个异常,但我更愿意了解问题的根源.

注意:在异常中,它告诉我实际的行数是2,期望的是1.为什么它更新2行,因为我只更改了1行?

感谢你的帮助!

编辑:

我能够发现原因是因为在更新样本时,数据库中有一个触发器更新Container表中的行(容器包含样本).有没有办法配置NHibernate,以便它知道这个触发器,并期望正确的行数更新?

c# nhibernate triggers exception

8
推荐指数
1
解决办法
5507
查看次数

脱钩后,C#仍然挂钩了一个事件

我目前正在调试一个包含内存泄漏的大型(非常大的!)C#应用程序.它主要使用Winforms作为GUI,尽管在WPF中制作了几个控件并使用ElementHost进行托管.到目前为止,我发现许多内存泄漏是由事件没有解开(通过调用 - =)引起的,我已经能够解决问题了.

但是,我刚刚遇到了类似的问题.有一个名为WorkItem(短期)的类,它在构造函数中注册到另一个名为ClientEntityCache(long long)的类的事件.这些事件从来没有被解开,我可以在.NET Profiler中看到WorkItem的实例在不应该因为那些事件而保持活着状态.所以我决定让WorkItem实现IDisposable,并在Dispose()函数中以这种方式取消事件:

public void Dispose()
{
  ClientEntityCache.EntityCacheCleared -= ClientEntityCache_CacheCleared;
  // Same thing for 10 other events
}
Run Code Online (Sandbox Code Playgroud)

编辑

这是我用于订阅的代码:

public WorkItem()
{
  ClientEntityCache.EntityCacheCleared += ClientEntityCache_CacheCleared;
  // Same thing for 10 other events
}
Run Code Online (Sandbox Code Playgroud)

我还将取消注册的代码更改为不调用新的EntityCacheClearedEventHandler.

编辑结束

我在使用WorkItem的代码中的适当位置调用了Dispose,当我调试时,我可以看到该函数真的被调用,而且我做 - =每个事件.但我仍然得到内存泄漏,我的WorkItems在Disposed之后仍然存活,在.NET Profiler中我可以看到实例保持活动,因为事件处理程序(如EntityCacheClearedEventHandler)仍然在它们的调用列表中有它们.我试图解开它们不止一次(倍数= =)只是为了确保它们不会被连接多次,但这没有帮助.

任何人都知道为什么会这样或者我能做些什么来解决问题?我想我可以更改事件处理程序以使用弱委托,但这需要大量的遗留代码.

谢谢!

编辑:

如果这有帮助,这里是.NET分析器描述的根路径:ClientEntityCache上有很多东西指向EntityCacheClearedEventHandler,它指向Object [],它指向另一个EntityCacheClearedEventHandler实例(我不明白为什么),它指向WorkItem.

c# events hook memory-leaks

7
推荐指数
1
解决办法
2334
查看次数

如何在WPF中为分隔符添加标头?

我想在WPF分隔符中添加一个标题(这样它看起来像是GroupBox的顶行).这样做的目的是将视图分成不同的部分,我不能使用GroupBox,因为我们的业务准则说我们必须使用分隔符......有人知道如何做到这一点吗?

编辑:

我知道可以通过使用其他控件(即边框和文本框)来实现此解决方案,但我想知道是否可以将Header属性添加到Separator对象.

c# wpf xaml header separator

7
推荐指数
1
解决办法
5284
查看次数

每个新的COM类都必须重新实现IUnknown接口吗?

对不起,如果这个问题对每个人来说都很明显,但我对COM很新.从我在这里看到的教程http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567看来,在C++中创建的每个COM类都必须实现自己的QueryInterface,AddRef和Release .由于这些方法应该对任何新类具有基本相同的实现,我不明白为什么没有一些抽象类或为开发人员实现它的任何东西.我不明白为什么我应该重新实现许多人已经一次又一次地实现的相同的事情(除非教程是错误的并且有一些东西).

谢谢

c++ com iunknown

5
推荐指数
1
解决办法
2769
查看次数

如何定义COM coclass的实现?

我是COM的新手,我在互联网上四处寻找如何用C++创建一个COM类(由C#使用).我在.idl文件中看到过,我必须放这样的东西:

[
object,
uuid(a93164ee-e6d4-44be-aa27-f00ce6972719),
helpstring("interface ITopologyQuery")
]

interface ITopologyQuery : IUnknown
{
  HRESULT LoadFile(BSTR completeFileName);

  HRESULT SetParameters(int above, int percentage);
}

[
  uuid(a958f2af-8b55-43c4-9fc3-c39d83fc1376)
]
library TopologyQueryLib
{
  [
    uuid(cc814992-31ec-4a1f-a41e-111ade27bdfe),
    helpstring("TopologyQuery class")
  ]
  coclass CTopologyQuery
  {
    [default] interface ITopologyQuery;
  };
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,你在哪里定义CTopologyQuery类?如果我将它定义为另一个文件中的常规c ++类,编译器是否会将该类与接口正确链接?c ++类代码看起来像这样(它在.cpp文件中实现):

class CTopologyQuery : public ITopologyQuery
{
  public:

    __stdcall CTopologyQuery();

    //IUnknown interface 
    HRESULT __stdcall QueryInterface(REFIID riid, void **ppObj);
    ULONG   __stdcall AddRef();
    ULONG   __stdcall Release();

    //ITopologyQuery interface
    HRESULT __stdcall LoadTopologyFile(BSTR completeFileName);
    HRESULT __stdcall SetParameters(int above, int percentage);

  private:
}; …
Run Code Online (Sandbox Code Playgroud)

c++ com coclass

5
推荐指数
1
解决办法
3131
查看次数

如何使用 Newtonsoft 反序列化可以是数组或字典的对象?

我正在使用一个 API,它返回一个我需要反序列化的 json 对象。我的问题是这些对象的成员之一有时是空数组(“[]”),有时是字典(“{“1”:{...},“2”:{...}}“ )。我想将它反序列化为数组或字典,因为我不关心 ID,我只想要所有对象的列表。这是我反序列化对象的方法:

var response = JsonConvert.DeserializeObject<Response>(json);
Run Code Online (Sandbox Code Playgroud)

这是 Response 类的定义:

public class Response
{
    [JsonProperty(PropertyName = "variations")]
    public Dictionary<int, Variation> Variations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当 Response 在它的变体字段中包含一个字典时它运行良好,但当它包含一个空数组时它会失败。我收到来自 Newtonsoft 的错误消息,说无法将数组反序列化为字典。如果我将 Variations 属性定义为数组,则它适用于空数组,但当它是字典时会失败。我该怎么做才能正确反序列化两个可能的值,或者忽略空数组并将 Variations 设置为 null 当它是一个数组而不是失败时。

谢谢。

c# json json.net deserialization

5
推荐指数
2
解决办法
5175
查看次数

是否有可能Krypton(Winforms库)存在内存泄漏问题

我正在调试一个大的Winforms应用程序,它有一些内存泄漏问题.我使用.NET内存分析器,到目前为止,我已经能够找到一些泄漏并解决它们.但是现在我遇到了一个问题,我不确定是一个问题,如果它是一个我不知道如何解决它.

运行我的应用程序1分钟后(考虑到普通用户可以使用它几个小时不是很多),.NET内存分析器向我展示了Krypton Toolkit中大约100-200个不同控件的实例,如果我这个数字正在增加继续前进(它们永远不会被垃圾收集,因为看起来它们仍被引用到某处).现在,如果我检查这些实例的根路径,它们看起来像:

Krypton ViewManager的根路径

我不知道在我的代码中查看哪些内容可以在不再需要这些实例时正确地取消引用,因为我不知道还在引用控件的内容.我知道KryptonButtonEx创建的地方,据我所知,ViewManager是由这个按钮创建的,但我仍然看不到我能做些什么.对于那些感兴趣的人,创建按钮的代码是这样的:

        KryptonButton newControlButton = new KryptonButton();
        newControlButton.Tag = mtActivityControl;
        newControlButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
        newControlButton.AutoSize = true;
        newControlButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly;
        newControlButton.ButtonStyle = ComponentFactory.Krypton.Toolkit.ButtonStyle.ListItem;
        newControlButton.Location = new System.Drawing.Point(3, 3);
        newControlButton.Name = string.Format("controlButton{0}", mtActivityControl.SymbolicName);
        newControlButton.Size = new System.Drawing.Size(96, 23);
        newControlButton.StateCommon.Content.Image.ImageH = ComponentFactory.Krypton.Toolkit.PaletteRelativeAlign.Near;
        newControlButton.StateCommon.Content.ShortText.TextH = ComponentFactory.Krypton.Toolkit.PaletteRelativeAlign.Near;
        newControlButton.TabIndex = 5;

        StringBuilder buttonText = new StringBuilder();
        buttonText.Append(Path.GetFileName(mtActivityControl.ControlName));
        /*if (mtActivityControl.SymbolicName.Length != 0)
        {
            buttonText.Append(" (");
            buttonText.Append(mtActivityControl.SymbolicName);
            buttonText.Append(")");
        }*/

        newControlButton.Text = buttonText.ToString();
        newControlButton.Values.ExtraText = "";
        newControlButton.Values.Image = null;
        newControlButton.Values.ImageStates.ImageCheckedNormal = null;
        newControlButton.Values.ImageStates.ImageCheckedPressed = null; …
Run Code Online (Sandbox Code Playgroud)

c# memory-leaks krypton winforms

4
推荐指数
1
解决办法
1456
查看次数

有没有办法在MFC中禁用消息框?

我有一个MFC应用程序(使用我无法更改的旧库).应用程序启动时,如果无法加载某些驱动程序,它会加载一些驱动程序并显示消息框.驱动程序的加载和消息框的显示是通过库中无法更改的方法完成的(让我们调用此方法Init).我想禁用这些消息框(防止它们"弹出").在调用Init暂时禁用消息框然后重新启用它之前,我可以调用一些东西吗?

(请注意,如果之后无法重新启用它们,我可以很好地使用它,我主要想禁用它们)

谢谢大家,

注意:如果有人想知道我为什么要这样做,那是因为我的应用程序公开了一个COM接口,并将被其他应用程序使用.它是应用程序的唯一原因是我使用的库在创建MFC应用程序(而不是dll)时更容易使用.当我的其他应用程序调用它时,我不希望显示消息框,我只是想在出现问题时获取错误.

c++ mfc

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