"ATL简单对象"向导未提供指定从现有coclass及其接口派生新类的方法.在Visual Studio 2008中,如何创建一个从现有的ATL COM类派生的新类(即Base实现IBase,我想创建一个Derived派生自Base该实现的新类IDerived,其中IDerived派生自IBase.)
更新:听起来很简单,但向导生成的ATL类最多有六个基类,一个COM映射和一个连接点映射.应该在派生类中重复哪些基类和映射?如果映射在派生类中重复,它们是否应包含基类映射的内容或仅包含其他项?基类的顺序是否重要?怎么样FinalConstruct()和FinalRelease()?应该DECLARE_PROTECT_FINAL_CONSTRUCT和DECLARE_REGISTRY_RESOURCEID在派生类中被重复?
这是一个示例基类,除了所有样板文件外都是空的.现在派生类应该是什么样的?
class ATL_NO_VTABLE CBase :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBase, &CLSID_Base>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CBase>,
public CProxy_IBaseEvents<CBase>,
public IDispatchImpl<IBase, &IID_IBase, &LIBID_ExampleLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CBase()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_Base)
BEGIN_COM_MAP(CBase)
COM_INTERFACE_ENTRY(IBase)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CBase)
CONNECTION_POINT_ENTRY(__uuidof(_IBaseEvents))
END_CONNECTION_POINT_MAP()
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void …Run Code Online (Sandbox Code Playgroud) 我想制作一个看起来完全像按钮的CheckBox.我最初的微弱尝试根本不起作用.
<CheckBox x:Name="test">
Testing!
<CheckBox.Template>
<ControlTemplate>
<Button>
<ContentPresenter/>
</Button>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
Run Code Online (Sandbox Code Playgroud)
ContentPresenter不起作用(按钮为空),单击该按钮时,IsChecked属性不会切换.此外,当IsChecked为真时,我不知道如何使按钮看起来被推.
我很惊讶地发现"ref"和"out"参数没有用特殊属性标记,尽管存在ParameterInfo.IsOut,ParameterInfo.IsIn(据我所知,它们都是假的),ParameterAttributes.在和ParameterAttributes.Out中.相反,"ref"参数实际上由一种特殊类型的"Type"对象表示,"out"参数只是具有附加属性的ref参数(我还不知道哪种属性).
无论如何,要创建一个by-ref参数,你可以调用Type.MakeByRefType(),但我的问题是,如果你已经有一个by-ref类型,你如何回到原始类型?
提示:它不是UnderlyingSystemType:
Type t = typeof(int);
Console.WriteLine(t.MakeByRefType().UnderlyingSystemType==t); // FALSE
Run Code Online (Sandbox Code Playgroud) 原则上,我开发了一种将RadioButtons绑定到几乎任何东西的简洁方法:
/// <summary>Converts an value to 'true' if it matches the 'To' property.</summary>
/// <example>
/// <RadioButton IsChecked="{Binding VersionString, Converter={local:TrueWhenEqual To='1.0'}}"/>
/// </example>
public class TrueWhenEqual : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object To { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return object.Equals(value, To);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value) return To;
throw new NotSupportedException();
} …Run Code Online (Sandbox Code Playgroud) 我有一个程序,在"Icons"文件夹中包含许多图标(包含在Build Action = Resource的项目中).
在XAML中,我可以使用诸如<Image Source="../Icons/name.png"/>(".."之类的代码访问这些图标,因为XAML位于不同的子文件夹中); 但是我想在同一个项目中的某些WinForms代码中使用相同的图像.不幸,
GetType().Assembly.GetManifestResourceStream("Icons/name.png");
Run Code Online (Sandbox Code Playgroud)
回归null和
GetType().Assembly.GetManifestResourceNames()
Run Code Online (Sandbox Code Playgroud)
只列出了一堆*.resources文件(每个文件一个.resx,一个名为*.g.resources).那么我该如何获得图像流呢?
在我的程序中,我有一组视图模型对象来表示ListBox中的项目(允许多选).viewmodel有一个IsSelected属性,我想绑定到ListBox,以便在viewmodel而不是列表框本身中管理选择状态.
但是,显然ListBox不会保留大多数屏幕外项目的绑定,因此通常IsSelected属性未正确同步.这是一些演示此问题的代码.第一个XAML:
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock>Number of selected items: </TextBlock>
<TextBlock Text="{Binding NumItemsSelected}"/>
</StackPanel>
<ListBox ItemsSource="{Binding Items}" Height="200" SelectionMode="Extended">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
<Button Name="TestSelectAll" Click="TestSelectAll_Click">Select all</Button>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
C#Select All处理程序:
private void TestSelectAll_Click(object sender, RoutedEventArgs e)
{
foreach (var item in _dataContext.Items)
item.IsSelected = true;
}
Run Code Online (Sandbox Code Playgroud)
C#viewmodel:
public class TestItem : NPCHelper
{
TestDataContext _c;
string _text;
public TestItem(TestDataContext c, string text) { _c = c; _text = text; }
public override string …Run Code Online (Sandbox Code Playgroud) 我刚刚因为一个奇怪的原因而进行了单元测试失败IDictionary<object, object>.
IDictionary<K,V>有两种Remove方法.一个拿a K,另一个拿a KeyValuePair<K,V>.考虑这两个词典:
IDictionary<string, object> d1 = new Dictionary<string, object>();
IDictionary<object, object> d2 = new Dictionary<object, object>();
d1.Add("1", 2);
d2.Add("1", 2);
Console.WriteLine(d1.Remove(new KeyValuePair<string, object>("1", 2)));
Console.WriteLine(d2.Remove(new KeyValuePair<object, object>("1", 2)));
Run Code Online (Sandbox Code Playgroud)
True那么输出就是False.既然KeyValuePair<object,object>是预期的确切类型d2.Remove(KeyValuePair<object,object>),为什么编译器调用d2.Remove(object)呢?
(验尸报告:
在提示我的问题的场景中,我没有IDictionary<object,object>直接使用,而是通过通用参数:
public class DictionaryTests<DictT> where DictT :
IDictionary<object,object>, new()
Run Code Online (Sandbox Code Playgroud)
因为问题是IDictionary优先于ICollection我,我决定通过包含ICollection在约束列表中来"解决问题" :
public class DictionaryTests<DictT> where DictT :
ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new()
Run Code Online (Sandbox Code Playgroud)
但这并没有改变编译器的思想......我想知道为什么不这样做.)
如何检测我的Compact Framework应用程序何时智能最小化(智能最小化是当用户单击Pocket PC右上角的"X"按钮时发生的情况)?
Deactivate事件不是正确的方式,因为它发生在最小化以外的情况下,例如在主窗体顶部显示消息框或其他窗体时.窗体的WindowState没有用,因为.NET CF上没有"Minimized"WindowState.
我听说通过设置MinimizeBox = false,我的应用程序将被关闭而不是最小化.但我实际上不希望我的应用程序关闭,我只是想知道它何时被最小化.
我找到了"添加Java异常断点"菜单项,但它似乎只适用于我选择的确切异常类型.因此,如果我要求它突破Exception,它不会在a的情况下中断NumberFormatException.如何让所有异常中断?
我的活动没有明显的原因退出没有LogCat输出,所以很高兴找到正在发生的任何异常,无论是捕获还是未捕获,无论是在我的代码中还是仅在Android中.
我有一些(工作)代码使用multimap<string,string>.我想改变它以禁止同一个键上的重复值(显然,同一个键上的不同值很好,否则我不会使用多个映射).
令人惊讶的是类型不似乎有一个内置的方式,以避免重复,也没有找到一个键值对(只找到一把钥匙).但我认为有人必须有一个现成的解决方法.任何人?