我正在以编程方式创建一些UI,这涉及一些繁重的处理.基本上我想要的是在我的UI被构建/添加到窗口时运行加载器动画.添加的UI是一些网格,一些图像被加载到它们中.
到目前为止,我已经尝试过BackgroundWorker,但由于我需要使用UI线程来添加我正在构建的UI,因此在添加的UI完成之前,加载器将无法启动/动画.
我也尝试过一些没有任何结果的异步方法.我的最后一次尝试是这样的,但它仍然需要访问UI线程,这最终将冻结UI动画,直到工作完成
private async void begin()
{
await this.LongRunOpAsync();
}
public Task LongRunOpAsync()
{
return Task.Run(() =>
{
InitGrid();
stopLoadingScreen();
});
}
Run Code Online (Sandbox Code Playgroud)
我可能会遗漏一些东西,但我不知道什么,我也没有想法这样做.任何帮助,将不胜感激.
编辑:有繁重工作的方法
private void makeIgrid()
{
Grid hostgrid = new Grid();
hostgrid.Name = "imagesHostGrid";
hostgrid.Width = 700;
hostgrid.VerticalAlignment = VerticalAlignment.Top;
hostgrid.HorizontalAlignment = HorizontalAlignment.Center;
hostgrid.SetValue(Canvas.ZIndexProperty, 0);
this.RegisterName(hostgrid.Name, hostgrid);
Grid imagegrid = new Grid();
imagegrid.Name = "imagegrid";
imagegrid.Height = height2;
//imagegrid.Width = 700;
imagegrid.SetValue(Canvas.ZIndexProperty, 0);
imagegrid.VerticalAlignment = VerticalAlignment.Top;
imagegrid.HorizontalAlignment = HorizontalAlignment.Center;
imagegrid.Margin = new Thickness(0, height1, 0, 0);//(left,top,right,bottom)
RowDefinition …Run Code Online (Sandbox Code Playgroud) 我正在从VB迁移到C#,并认为WPF对我来说是最好的选择,因为我一直在开发的程序是基于GUI的高度依赖的应用程序.但是,在尝试获取VB中的简单任务以使用C#代码时,C#给我带来了很多麻烦,困惑和沮丧.在VB中,我可以很容易地使用它.但是在C#中,花了无数个小时(现在几天)搜索和玩代码之后,我仍然不知道如何让这个工作.
我的情景:
在page1.xaml.cs中使用下面的代码时,我可以轻松地向wrappanel添加一个新按钮:
Button New_Button = new Button();
My_WrapPanel.Children.Add(New_Button);
Run Code Online (Sandbox Code Playgroud)
我也试过调用第2页的page1中的方法来创建按钮,但新的按钮没有显示在wrappanel中!
我真的很感激一些帮助,可能还有一个简单的代码示例来帮助我.
我是GUI开发的新手,我知道Winforms和WPF之间的转换以前已经解决了.然而,作为一个新手,我仍然不清楚前进的最佳方式,我将非常感谢你的帮助.
我基本上有两个我想要组合的SDK示例代码.一个示例代码用winforms编写,另一个用WPF编写.当我设想我的最终产品包含动画时,我相信我应该将winforms代码翻译成WPF(如果你不同意,请纠正我).然而,它是一个复杂而冗长的代码,因为我对winforms相对更加舒服,我想知道我是否应该考虑使用WPF来赢取翻译并使用Open GL控件.什么是最有效的前进方式?从winforms示例代码中,我需要来自DataGrid和WPF的数据,我需要访问当前显示在WindowsFormsHost上的512x512实时图像.
非常感谢大家的帮助!!
我是WPF的新手,我正在使用这段代码用网格填充uniformgrid,
public MainWindow()
{
InitializeComponent();
SolidColorBrush defaultBrush = new SolidColorBrush(Colors.Wheat);
SolidColorBrush alternateBrush = new SolidColorBrush(Colors.Black);
Char L = 'A';
int N = 1;
for (int i = 0; i < 64; i++)
{
Grid cell = new Grid();
if(N==9)
{
N=1;
L++;
}
if ((i + i / 8) % 2 == 0)
{
cell.Name = L + N.ToString();
cell.Background = defaultBrush;
ChessBoard.Children.Add(cell);
}
else
{
cell.Name = L + N.ToString();
cell.Background = alternateBrush;
ChessBoard.Children.Add(cell);
}
N++
}
Run Code Online (Sandbox Code Playgroud)
然后,当我点击名为ChessBoard的uniformedgrid时,我试图找出某个网格的名称.
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个递归方法来取消选择WPF TreeView中的所有项目.使事情变得复杂的是每个TreeViewItem都不是迷你TreeView.这会导致你不得不来回做很多.所以,这是我尝试过的:
TreeViewDeselectAll(myTreeView.Items);
// Must send in ItemCollection to allow the recursive call
private void TreeViewDeselectAll(ItemCollection myTreeViewItems)
{
// The only way to get to the IsSelected property is to turn it back into a TreeViewItem
foreach (TreeViewItem currentItem in myTreeViewItems)
{
currentItem.IsSelected = false;
if (currentItem.HasItems)
{
// Recursify!
TreeViewDeselectAll(currentItem.Items);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人成功取消选择TreeView中的所有项目?您是否能够以递归方式遍历TreeView?
Winforms TreeView有一个Nodes集合,它实际上是一个迷你TreeView.这允许递归很好.但是WPF TreeView没有节点.
在.Net 4.0中工作.
我本质上是一个网络和后端程序员.通常我尝试avaoid制作Windows程序.现在我必须创建一个WPF客户端.
我有一个后台任务,每隔一段时间就会举办一次活动.(它像轮询器一样工作,当满足标准时,会引发一个事件).Noob和我一样,我写了这个附加到事件的代码来更新UI.
private void IsDisconnectedEvent()
{
UserWindow.Visibility = Visibility.Hidden;
DisconnectWindow.Visibility = Visibility.Visible;
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个例外,因为我不在同一个线程上.经过一些谷歌搜索后,我发现我应该改变代码:
private void IsDisconnectedEvent()
{
Dispatcher.Invoke(() =>
{
UserWindow.Visibility = Visibility.Hidden;
DisconnectWindow.Visibility = Visibility.Visible;
});
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但这不是唯一的事件,因此使我的代码变得丑陋丑陋.有没有更好的方法来做到这一点?
项目: 我有一个父面板,其中包含一个ComboBox和FlowLayoutPanel。FlowLayoutPanel拥有可变数量的子面板(从UserControl继承的自定义控件)。每个子面板包含一些标签,两个ComboBox,一个按钮以及一个带有3个ComboBox列和一个按钮列的DataGridView。DataGridView可能有1-6行。从父面板的ComboBox中选择一个项目时,FlowLayoutPanel会填充子面板。

问题: 用大约50个子面板填充FlowLayoutPanel大约需要2.5秒。具体来说,我确定对FlowLayoutPanel.Controls.AddRange()的调用是罪魁祸首。
相关代码:我无法在此处发布所有代码(太多代码及其部分内容是机密的),但我会尽力解释正在发生的事情。
父面板:
private void displayInformation(Suite suite)
{
this.SuspendLayout();
// Get dependencies.
List<SuiteRange> dependents = new List<SuiteRange>(suite.dependencies.Keys);
dependents.Sort(SuiteRange.Compare);
// Create a ChildPanel for each dependent.
List<ChildPanel> rangePanels = new List<ChildPanel>();
foreach (SuiteRange dependent in dependents)
{
ChildPanel sdp = new ChildPanel();
sdp.initialize(initialSuite.name, dataAccess);
sdp.displayInformation(dependent, suite.dependencies[dependent]);
rangePanels.Add(sdp);
}
// Put the child panels in the FlowLayoutPanel.
flpDependencyGroups.SuspendLayout();
// Takes ~2.5 seconds
flpDependencyGroups.Controls.AddRange(rangePanels.ToArray());
flpDependencyGroups.ResumeLayout();
// Takes ~0.5 seconds
updateChildPanelSizes();
this.ResumeLayout();
}
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情:
如何使用TaskFactory创建新的UI元素?当我尝试时,我收到以下错误:
调用线程必须是STA,因为许多UI组件都需要这个.
示例代码
Dim txtBoxList as new List(Of TextBox)
Sub StartThread()
Dim TS As TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
Task.Factory.StartNew(Sub() CreateControl(), TS)
End Sub
Sub CreateControl()
Dim txtBox As New TextBox
Dispatcher.BeginInvoke(Sub() txtBoxList.Add(txtBox))
End Sub
Run Code Online (Sandbox Code Playgroud) 我正在尝试 WPF 绑定。我写了一个小应用程序,但有问题,我的用户界面没有更新。这是我的代码:
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="345,258,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<TextBox x:Name="text" HorizontalAlignment="Left" Height="23" Margin="75,165,0,0" TextWrapping="Wrap" Text="{Binding Path=Count}" VerticalAlignment="Top" Width="311"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
和代码隐藏:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
MyClass mc;
public MainWindow()
{
InitializeComponent();
mc = new MyClass(this.Dispatcher);
text.DataContext = mc;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Task task = new Task(() =>
{
mc.StartCounting();
});
task.ContinueWith((previousTask) =>
{
},
TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
}
}
public class MyClass
{
public int Count { get; …Run Code Online (Sandbox Code Playgroud) 我看了50个或更多关于这个控件的网页.在我看来,这对我来说可能毫无用处.
它接缝"GridView"是"ListView"控件的"视图".我在使用控件和加载数据时没有任何问题,但操纵它似乎很困难.
public partial class Designer : UserControl
{
public Designer()
{
InitializeComponent();
List<RandomData> NewItem = new List<RandomData>();
NewItem.Add(new RandomData { Column1 = "Item1", Column2 = "MoreData", Column3 = "MoreData", Column4 = "MoreData" });
ListView_1.ItemsSource = NewItem;
}
}
public class RandomData
{
public String Column1 { get; set; }
public String Column2 { get; set; }
public String Column3 { get; set; }
public String Column4 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
很简单,它将数据加载到列中.但是我想在那里加载其他东西.像复选框或图像文件或东西.
public Designer()
{
InitializeComponent();
CheckBox AttemptThis = …Run Code Online (Sandbox Code Playgroud) WPF/VC++(C++/cx) - Visual Studio 2013
所以我有一个ListBox,其中填充了我创建的UserControl.每次页面更改时数据都会丢失,这是不幸的.因此,我可以选择在每次加载页面时将数据加载到ListBox中,或者在页面之间传递数据.他们每个人都有自己的优势和劣势,但有一种做法更受欢迎吗?
我想要考虑的事情是ListBox中有多少UserControl,这可能是一个很大的数量(大到10000+),以及数据的存储方式.现在我将数据存储在AVLTree中,主要用于组织,因此不需要进行排序.通常只有10页,其中6页通常被导航到(其中4页是很少使用或仅使用过一次的菜单页面),因此数据不必经常在页面之间传递.每个数据节点的大小只有大约1mb,所以不是很大,但是大到足以在你开始超过10000个条目时产生差异(这可能被认为是一种罕见的情况).
我来自游戏编程,因此速度和效率是首要目标.
是的,这是一个主观问题,但是专业人士或一般编程社区可能有一个首选方法.
我有一个需要从 GridView 继承的自定义控件。和标准方式,适用于 UserControl,
<UserControl.Resources>
<local:NodeToImageConverter x:Key="imageConverter" />
<local:ImageHeightConverter x:Key="imageHeightConverter" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
它对我不起作用。我真的很想使用本地资源——而不是把它们放在更高的位置。我试图创建一个级别的类并为那里的资源声明一个依赖属性。但它没有用:
public partial class CustomDetailsView2 : GridViewRes {
public CustomDetailsView2() {
InitializeComponent();
} // it is interesting that if i set a breakpoint here i see my resourses - 2 items
}
public class GridViewRes : GridView {
public static DependencyProperty ResourcesProperty = DependencyProperty.Register(
"Resources",
typeof(ResourceDictionary),
typeof(CustomDetailsView2),
new FrameworkPropertyMetadata() {
DefaultValue = new ResourceDictionary()
});
public ResourceDictionary Resources {
get { return (ResourceDictionary)GetValue(ResourcesProperty); }
set { SetValue(ResourcesProperty, value); …Run Code Online (Sandbox Code Playgroud) wpf ×11
c# ×10
.net ×2
winforms ×2
.net-2.0 ×1
c++-cx ×1
gridview ×1
taskfactory ×1
treeview ×1
uniformgrid ×1
vb.net ×1
visual-c++ ×1
xaml ×1