我试图将32位dll(和应用程序)移植到64位,我已经设法构建它没有错误.当我尝试使用我的64位应用程序加载它时,我注意到导出的函数名称不同.这是我导出函数的方式:
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) long __stdcall Connect(char * name, long size);
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
在Dependency Walker中,导出的函数具有以下格式:
32位: _Connect@8
64位: Connect
在使用dll的应用程序中,我显式加载了dll(LoadLibrary成功)但GetProcAddress因64位而失败,因为它找不到具有提供名称的函数.
在我们的应用程序中,我保留函数名称如下:
#define ConnectName "_Connect@8"
...
GetProcAddress(Dll, ConnectName);
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否可以为32位和64位dll导出相同的函数名称,或者这是一个坏主意?或者我需要在我的应用程序中执行以下操作:
#if _WIN64
#define ConnectName "Connect"
#else
#define ConnectName "_Connect@8"
#endif
Run Code Online (Sandbox Code Playgroud)
我感谢任何帮助.
在我的WPF应用程序中,我想要一个菜单项有一个文本框.我已设法使用以下代码执行此操作:
<Menu Height="23" HorizontalAlignment="Stretch" Name="MainMenu" VerticalAlignment="Top">
<MenuItem Header="File">
<MenuItem Header="Exit" Click="menuItemExit_Click" />
</MenuItem>
<MenuItem Header="Settings">
<MenuItem Header="Some setting" IsCheckable="True" />
<Separator />
<MenuItem>
<MenuItem.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Content="Some value:" Margin="0,3,6,0" Padding="0" />
<TextBox Margin="0,0,0,6" Grid.Column="1" />
</Grid>
</MenuItem.Header>
</MenuItem>
</MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)
此代码显示像我预期的菜单项,但如果我开始在文本框中键入一些值,然后移动鼠标(而不是单击)远离文本框菜单项,文本框失去焦点,我无法继续键入,直到我点击再次在文本框上.如何在WinForms中实现与文本框菜单项相同的行为?也就是说,如果用户在文本框外部单击或按Tab键,则文本框仅失去焦点.
提前致谢.
关于FindAncestor的一个特别之处让我感到困惑,请看下面的例子:
<Expander.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Name="headerLabel" Content="Show Contents" Padding="0" VerticalAlignment="Center" />
<Button Name="headerButton" Margin="6,0,0,0" Content="Button" Padding="6,1" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" Value="True">
<Setter TargetName="headerLabel" Property="Content" Value="Hide Contents" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Expander.HeaderTemplate>
Run Code Online (Sandbox Code Playgroud)
我使用上面的xaml来更改我的自定义扩展器标头的文本.我的问题是,当我想在绑定中使用祖先的属性时,我何时才需要显式使用FindAncestor?因为以下三个绑定似乎至少在我的场景中产生相同的结果:
Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}"
Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}"
Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Path=IsExpanded}"
Run Code Online (Sandbox Code Playgroud)
我看过很多这三个例子,这只是个人品味的问题吗?
是否可以捕获 WPF 中鼠标额外按钮的点击?我想在我的应用程序中使用鼠标实现后退和前进导航,就像浏览互联网一样。当单击额外的按钮时,我想执行命令。我只找到了使用左/右/滚轮按钮的示例。
提前致谢。
我仍然认为自己是 MVVM 的初学者,并且我在 TabControl 中遇到了绑定问题。我的应用程序允许用户创建国家和州,输入一些信息,然后将它们保存到数据库中。下面是我的应用程序结构的描述:
基础 ViewModel/View 称为 ApplicationViewModel/ApplicationView。ApplicationViewModel 有一个名为 Tabs 的 ObservableCollection,由一个 AllNationsViewModel 和一个 AllStatesViewModel 组成。此 Tabs 属性绑定到 ApplicationView 中的 TabControl 的 ItemsSource。
AllNationsViewModel/AllNationsView 用于显示用户输入的所有国家。它还允许用户创建新的国家并选择一个特定的国家进行仔细检查。AllStatesViewModel/AllStatesView 做同样的事情,但对于状态。
最后,我有处理特定国家的 NationViewModel/NationsView;这里还有 StateViewModel/StateView 对状态做同样的事情。
对于一个国家,您目前只能输入一个名称,但对于一个州,您可以输入一个名称以及它所属的国家。使用组合框选择国家,其中显示在国家选项卡中创建的所有国家。
我使用名为 DataFacade 的静态类作为数据存储的接口。可以使用此界面添加、删除和检索国家/地区列表;它还会在添加或删除某些内容时触发事件。
我遇到的问题是,当在 AllStatesViewModel(CurrentStateViewModel 属性)中选择了一个州时,我转到国家选项卡,然后返回到状态选项卡,当前选定的州已经失去了它的国家。所有其他州仍然很艰难。
我将尝试在下面显示相关代码(我已从某些方法中删除了不相关的代码):
状态类:
class State
{
public string Name { get; set; }
public Nation Nation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ApplicationView 中的 TabControl:
<TabControl ItemsSource="{Binding Tabs}" Margin="6">
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding DisplayName}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding }" />
</DataTemplate> …Run Code Online (Sandbox Code Playgroud) 我正在尝试将《WPF 4 Unleashed》一书中找到的饼图 ProgressBar 调整为看起来像甜甜圈。我觉得我已经成功了一半,但我不知道如何解决最后一个问题。
这是一张图片,说明了我想要的以及我已经实现的目标:
所以我的问题是,如何将其修复为我想要的样子?
以下是我正在使用的相关xaml:
<ControlTemplate x:Key="DonutProgressBar" TargetType="{x:Type ProgressBar}">
<ControlTemplate.Resources>
<conv:ValueMinMaxToIsLargeArcConverter x:Key="ValueMinMaxToIsLargeArcConverter" />
<conv:ValueMinMaxToPointConverter x:Key="ValueMinMaxToPointConverter" />
</ControlTemplate.Resources>
<Grid>
<Viewbox>
<Grid Width="20" Height="20">
<Ellipse x:Name="Background"
Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}"
Width="20"
Height="20"
Fill="{TemplateBinding Background}" />
<Path x:Name="Donut"
Stroke="{TemplateBinding Foreground}"
StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure StartPoint="10,0">
<ArcSegment Size="10,10" SweepDirection="Clockwise">
<ArcSegment.Point>
<MultiBinding Converter="{StaticResource ValueMinMaxToPointConverter}">
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value" />
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Minimum" />
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum" /> …Run Code Online (Sandbox Code Playgroud) 首先介绍一下背景。我为我的 WiX 安装程序创建了一个 WPF 引导程序应用程序,我需要在其中检索和显示默认安装位置。除非我做错了什么,即使我的 Visual Studio 配置设置为 x64,WiX 创建的可执行文件似乎始终是 32 位的,这会导致我的问题。
由于可执行文件始终为 32 位,因此即使我想安装 x64 MSI 文件,包含我的 WPF 引导程序应用程序的库也会加载为 32 位。所以,当我尝试使用它检索默认的安装路径Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),我得到C:\ Program Files文件(x86)的,而不是C:\ Program Files文件。在 64 位操作系统上运行时,如何从 32 位进程中检索C:\Program Files?
我发现了类似的问题,但我没有找到足够的答案,我想要一个即使操作系统语言不是英语也能工作的解决方案。我正在考虑从检索到的路径中删除“(x86)”,但它看起来很笨拙,我不确定它是否适用于所有情况。