我不确定这是否是提出此类概念信息建议的正确位置,所以如果在Stack Overflow中询问它是不相关的还是偏离主题我会道歉.
我想在WPF中开发一个应用程序,它能够绘制具有常规控件功能的多边形,它们可以通过添加,移除或移动顶点来改变形状,通过运行时更改画笔,从数据绑定或直接更改画笔从C#代码操作(仍然不确定).
我想要实现的是绘制地图的应用程序,其上的形状是地图上具有动态边界的实体(例如说政治边界).多边形也必须是具有碰撞测试的可点击控件(不仅仅是一个边界框,而是完全由地图上实体的形状).我可以期待形状非常详细,因为河流和山脉或其他自然物体发现的边界不仅仅是两个顶点的直线,所以它的性能应该是一个重要的因素,因为一个多边形可能包含数百个顶点) .
我得出的结论是,可以通过WPF实现这样的应用程序.但我的不确定性是实现地图绘制的最有效方式,也许我应该像SharpDX一样实施D3D托管,但我不想要它,它会让事情变得更加复杂和困难.
我更喜欢这张地图中的所有内容都可以作为常规WPF控件使用它的数据绑定和样式化功能.几个月来,我与WPF开发了几个小型测试项目,以学习基础知识及其主要概念.但现在我的主要兴趣是用WPF开发.我需要一些建议,因为绘制复杂和动态的形状对我来说仍然不是很清楚,继续开发它.
I've deleted the _tmain() method which the IDE generated because I find no sense having two entry points after adding my WinMainentry. And yes, this is my first ever C++ application and I am a newbie, but please be nice.
So that's all I got:
// Included headers:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
// Shortened namespaces:
using namespace std;
// The main entry of the application:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) …Run Code Online (Sandbox Code Playgroud) 我刚刚从我的解决方案中删除了"App.xaml"并创建了我自己的xamlless入门类,我正在实现传统的静态Main()方法.
我正在实例化一个新Application类并在调用它的Run()方法之前进行设置,给它一个StartupUri,然后添加一个新的资源字典,以便自动应用我的样式.一切都按预期工作,主窗口显示,资源加载,模板正确应用于所有控件和窗口.
但我需要知道这样做是否有任何不良后果?该App课程为我提供了什么,所以我应该保留它而不是用我自己的紧凑和无模式入口点替换它给我同样的结果?
public static class Entry
{
private static readonly Application _application = new Application();
[STAThread]
public static void Main()
{
_application.StartupUri = new Uri( "/Eurocentric;component/Interface/MainWindow.xaml" , UriKind.Relative );
var style = new ResourceDictionary
{
Source = new Uri( "/Eurocentric;component/Interface/Styles/VictorianStyle.xaml", UriKind.Relative )
};
_application.Resources.MergedDictionaries.Add( style );
TemplatedWindow.Defaults();
_application.Run();
}
}
Run Code Online (Sandbox Code Playgroud) 假设我在循环中有一个简写的if-else语句,就像在这种情况下:
for(...)
{
a = b == c ? b : c;
// More unnecessary code if the result was true.
}
Run Code Online (Sandbox Code Playgroud)
我想通过条件的结果打破循环:
for(...)
{
a = b == c ? b break : c;
// Now the unnecessary code is not executed.
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以像在这个例子中那样完整地输入它:
for(...)
{
if( b == c )
{
a = b;
break;
}
else
{
a = c;
}
// Now the unnecessary code is not executed.
}
Run Code Online (Sandbox Code Playgroud)
但是它太长了,我试图将每一个破坏条件放在一条线上,因为它们有几个.
我有一个简单的静态属性FontSizeTitle,它应该用于所有HandledWindow类型实例中的风格化标题,并在更改属性后同时从同一个静态属性更新而无需明确通知。通过设置面板或任何会更改属性的内容,以便直观地更改和更新所有窗口的所有标题的字体大小。
这是我在 XAML 中风格化标题的代码,它是 模板的HandledWindow一部分,它是标准 XAML 样式页面的一部分,在启动时由另一个库中的资源字典加载。因此它适用于HandledWindow将出现在应用程序中的所有实例:
<TextBlock x:Name="TitleText"
TextWrapping="Wrap"
Text="Window Title"
FontSize="{Binding Source={x:Static UI:HandledWindow.FontSizeTitle}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Stretch"
FontFamily="{DynamicResource FontFamiliy}" />
Run Code Online (Sandbox Code Playgroud)
这是我的简单静态属性,请注意绑定实际上仅在第一次有效。
public static double FontSizeTitle
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
通过HandledWindow类型的基本构造函数将其设置为 15,该大小有效,但是如果在初始化后再次将其设置为另一个大小,则视觉标题不会更新。
首先这里是窗口本身的 XAML 代码:
<!-- Window Main -->
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Name="Window_Main" x:Class="WPF_Test.General_Window"
Title="General_Window" Height="500" Width="1000" BorderThickness="30" ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowStyle="None" StateChanged="Window_Main_StateChanged">
<!-- Effects -->
<Window.Effect>
<DropShadowEffect x:Name="Border_Effect" ShadowDepth="0" BlurRadius="30" Direction="0" Opacity="0.5"/>
</Window.Effect>
<!-- Border Main -->
<Border x:Name="Border_Main" BorderBrush="Gray" BorderThickness="1">
<!-- Panel Main -->
<DockPanel x:Name="Panel_Main">
<DockPanel x:Name="Panel_Title" Height="25" LastChildFill="False" Background="#FFEEEEEE" MouseDown="Panel_Title_MouseDown" VerticalAlignment="Top" DockPanel.Dock="Top">
</DockPanel>
<DockPanel x:Name="Panel_Secondary" LastChildFill="true" Background="#FFEEEEEE"/>
</DockPanel>
</Border>
Run Code Online (Sandbox Code Playgroud)
这是该窗口的构造函数的 C# 代码,我在其中明确定义了窗口的最小尺寸,但是在重新调整大小时它们仍然被忽略:
public void Window_Init()
{
Window_Main.MinHeight = Window_Minimum_Height + Window_Thickness * 2;
Window_Main.MinWidth = Window_Minimum_Width …Run Code Online (Sandbox Code Playgroud) 有时我有静态类型,它们确实应该是静态的,但在极少数情况下我需要重用一些代码(几种方法).我可以创建一个接口或另一个基本的抽象类,并解决几个静态类的问题,这些静态类都需要覆盖相同的方法和成员,但稍作修改.但它仍然需要我复制粘贴大部分代码,我将无法将它们标记为静态.
我想在处理当前项目并迭代时访问下一个和上一个项目(如果在范围内)IEnumerable<object>,它缺少索引器(据我所知)。
我不想需要一个List<object>集合或一个数组来实现这一点,尽管这是我现在知道的唯一选择。
如果可能,我也更愿意避免使用 Linq 表达式。
目前我的方法是这样定义的:
public static void PrintTokens(IEnumerable<object> tokens)
{
foreach (var token in tokens)
{
// var next = ?
// var prev = ?
}
}
Run Code Online (Sandbox Code Playgroud) c# ×7
wpf ×4
xaml ×3
static ×2
break ×1
c++ ×1
class ×1
css ×1
data-binding ×1
drawing ×1
entry-point ×1
foreach ×1
ienumerable ×1
if-statement ×1
loops ×1
overriding ×1
polygon ×1
resizegrip ×1
reusability ×1
shapes ×1
shorthand ×1
winmain ×1