我已经在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窗口,没有帮助文件.
任何接受者?
我最近的任务是在代码的一部分中查找内存泄漏.泄漏最终出现在特定对象的析构函数中......我发现了一些非常奇怪的东西.一位前同事写道:
File::~File()
try
{
Clear();
}
catch (...)
{
Log("caught exception");
}
Run Code Online (Sandbox Code Playgroud)
文件类继承自一些基类.我的第一个问题是:这是严格合法的C++吗?它在Visual Studio 2008中编译,但我向几个朋友/同事展示了它们,并且它们相当惊恐,它的工作原理.
但它实际上并没有按预期工作:这个对象继承的基类有一个现在永远不会被调用的析构函数(而不是如果你只是将析构函数包装在常规方法块中,将try/catch作为一部分)那个方法).
任何人都可以尝试解释为什么允许这样做,以及为什么没有调用基类析构函数?这里的析构函数并没有抛出.
微软用于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) 我正在使用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语句结束.
是否有更优雅的方式来动态调用子类构造函数?
如果您熟悉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# ×4
.net ×1
asp.net ×1
c++ ×1
charts ×1
chm ×1
data-binding ×1
encryption ×1
interop ×1
reflection ×1
security ×1
winforms ×1
wpf ×1