小编phy*_*ler的帖子

使用F1帮助(CHM格式)使用WPF

我已经在WPF应用程序上工作了一段时间,现在是时候将CHM格式的帮助文档附加到它了.

可惜!HelpProvider是在Winforms中显示CHM文件的标准方法,它已经神奇地消失了,并且在WPF中没有对应物.我一直在尝试使用WindowsFormsHost来生成一个新的控件,所以我实际上可以显示帮助,但实质上它只是抓住了整个UI的控制权.

更多细节:我有一个我想要的菜单项,当点击时,打开CHM文件.

首先我设置了WindowsFormsHost ......

host = new System.Windows.Forms.Integration.WindowsFormsHost();
helpForm = new System.Windows.Forms.Control();
host.Child = helpForm;
host.Visibility = System.Windows.Visibility.Hidden;
this.grid1.Children.Add(host);

hp = new System.Windows.Forms.HelpProvider();
hp.HelpNamespace = "Somehelpfile.chm";
hp.SetHelpNavigator(helpForm, System.Windows.Forms.HelpNavigator.TableOfContents);
Run Code Online (Sandbox Code Playgroud)

然后我说,瞧,揭示自己.

private void Help_Click(object sender, RoutedEventArgs e)
{
    host.Visibility = Visibility.Visible;
    helpForm.Show();
    hp.SetShowHelp(helpForm, true);
}  
Run Code Online (Sandbox Code Playgroud)

我不确定从哪里开始.当我显示helpForm时,它会模糊/覆盖现有的UI,而我得到的只是一个灰色的空WPF窗口,没有帮助文件.

任何接受者?

c# chm wpf interop winforms

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

Try/Catch块替换析构函数中的方法块

我最近的任务是在代码的一部分中查找内存泄漏.泄漏最终出现在特定对象的析构函数中......我发现了一些非常奇怪的东西.一位前同事写道:

File::~File()
try
{
    Clear();
}
catch (...)
{
    Log("caught exception");
}
Run Code Online (Sandbox Code Playgroud)

文件类继承自一些基类.我的第一个问题是:这是严格合法的C++吗?它在Visual Studio 2008中编译,但我向几个朋友/同事展示了它们,并且它们相当惊恐,它的工作原理.

但它实际上并没有按预期工作:这个对象继承的基类有一个现在永远不会被调用的析构函数(而不是如果你只是将析构函数包装在常规方法块中,将try/catch作为一部分)那个方法).

任何人都可以尝试解释为什么允许这样做,以及为什么没有调用基类析构函数?这里的析构函数并没有抛出.

c++ visual-studio-2008

6
推荐指数
1
解决办法
927
查看次数

在C#中,为什么在内存中固定密钥更安全?

微软用于C#中加密/解密的示例代码有一条无法解释的行,它将密钥固定在内存中.我理解钉扎的概念 - 它用于表示GC不应该将该内存的内容移动到其他位置.当然,很好.

固定密钥有什么好处?我很确定有一个 - 一个非常聪明的开发人员,曾经一度提到过,这是我们软件安全的重要一步.MS 文章中的相关代码.

static void Main()
{
    // Must be 64 bits, 8 bytes.
    // Distribute this key to the user who will decrypt this file.
    string sSecretKey;

    // Get the key for the file to encrypt.
    sSecretKey = GenerateKey();

    // For additional security pin the key.
    GCHandle gch = GCHandle.Alloc( sSecretKey, GCHandleType.Pinned );

    // Encrypt the file.        
    EncryptFile( @"C:\MyData.txt", @"C:\Encrypted.txt", sSecretKey );

    // Decrypt the file.
    DecryptFile( @"C:\Encrypted.txt", @"C:\Decrypted.txt", sSecretKey );

    // Remove the …
Run Code Online (Sandbox Code Playgroud)

c# security encryption

6
推荐指数
1
解决办法
1418
查看次数

如何在C#中动态调用构造函数?

我正在使用LINQ-to-XML来查询文件以获取对象列表.它们都具有相同的结构(一组选项,一组不确定长度的参数).基于XML文件中的名称,我想将参数用于完全不同的东西 - 所以我创建了这个对象的子类.

我的问题是 - 如何动态调用正确的构造函数,而不执行类似case语句的操作?或者从XML优雅地实例化不同子类的解决方案是否位于其他地方?

class Object1
{
    string name;
    OptionObj opt;
    List<Param> parameters;
}

class sonOfObject : Object1
{
    public void ExecuteSomething()
    {
         //do something with the parameters
    }
}

class secondSonOfObject : Object1
{
    public void ExecuteSomething()
    {
         //do something entirely different with the parameters
    }
}

var query = from x in xmlDoc.Descendants("Object")
    select new Object
    {
        //select the object from the XML
    }
Run Code Online (Sandbox Code Playgroud)

在这段代码之后,我可以使用复制构造函数从更通用的查询对象中创建一个sonOfObject.但是,如何根据子类的名称动态地执行此操作?

我知道你可以从一个类型中获取MethodInfo并调用它ala ...

MethodInfo m = t.GetMethod(someName);
m.Invoke(yourObj, null);
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须实例化这些子类对象中的9个或10个(并获取每个类对象的类型),并且仍然以某种case语句结束.

是否有更优雅的方式来动态调用子类构造函数?

.net c# reflection

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

ASP.NET图表控件 - 动态添加和删除一系列数据点

如果您熟悉ASP.NET的图表控件,则Chart对象包含许多Series对象 - 这些对象是可以绘制图表的一系列数据点.每个系列都可以在同一图表上以不同的方式(条形或点或线)显示.

我有一个自定义控件,用于在UI中创建和删除和修改Series列表.单击按钮后,将使用这些系列创建图表.但是,如果我尝试重新显示图表(即使是相同的系列),它会爆炸并抛出NullReferenceException.

这是相关的代码 - 我有一个对象包装系列(因为我有一些自定义属性)

public class DataSeries
{
    private Series _series = new Series();
    ... (bunch of other properties)
    public Series Series
    {
        get { return _series; }
        set { _series = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在控件本身,我将这些列表存储为属性(我只在非回发期间创建对象,因为我希望列表保持不变):

private static List<DataSeries> seriesList;

public List<DataSeries> ListOfSeries
    {
        get { return seriesList; }
        set { seriesList = value; }
    }

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            seriesList = new List<DataSeries>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我有一些控件的混合,我可以用来添加新的DataSeries,删除它们,并修改它们的属性.这一切都有效.

当他们点击页面上的"创建图表"时,这是执行的代码:

protected void …
Run Code Online (Sandbox Code Playgroud)

c# asp.net data-binding charts

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