相关疑难解决方法(0)

WPF UI多任务处理

我正在以编程方式创建一些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)

c# wpf multithreading

4
推荐指数
1
解决办法
3113
查看次数

如何动态地将控件添加到另一个类的WrapPanel中?

我正在从VB迁移到C#,并认为WPF对我来说是最好的选择,因为我一直在开发的程序是基于GUI的高度依赖的应用程序.但是,在尝试获取VB中的简单任务以使用C#代码时,C#给我带来了很多麻烦,困惑和沮丧.在VB中,我可以很容易地使用它.但是在C#中,花了无数个小时(现在几天)搜索和玩代码之后,我仍然不知道如何让这个工作.

我的情景:

  • 我有2个xaml页面.
  • 第一个xaml页面有一个wrappanel.
  • 第二个xaml页面有一个按钮,它将创建一个新按钮并将其添加到xaml第1页中的wrappanel.

在page1.xaml.cs中使用下面的代码时,我可以轻松地向wrappanel添加一个新按钮:

Button New_Button = new Button();
My_WrapPanel.Children.Add(New_Button);
Run Code Online (Sandbox Code Playgroud)

我也试过调用第2页的page1中的方法来创建按钮,但新的按钮没有显示在wrappanel中!

我真的很感激一些帮助,可能还有一个简单的代码示例来帮助我.

.net c# wpf

2
推荐指数
1
解决办法
1万
查看次数

将WinForms转换为WPF或将WPF转换为Winforms的效率更高

我是GUI开发的新手,我知道Winforms和WPF之间的转换以前已经解决了.然而,作为一个新手,我仍然不清楚前进的最佳方式,我将非常感谢你的帮助.

我基本上有两个我想要组合的SDK示例代码.一个示例代码用winforms编写,另一个用WPF编写.当我设想我的最终产品包含动画时,我相信我应该将winforms代码翻译成WPF(如果你不同意,请纠正我).然而,它是一个复杂而冗长的代码,因为我对winforms相对更加舒服,我想知道我是否应该考虑使用WPF来赢取翻译并使用Open GL控件.什么是最有效的前进方式?从winforms示例代码中,我需要来自DataGrid和WPF的数据,我需要访问当前显示在WindowsFormsHost上的512x512实时图像.

非常感谢大家的帮助!!

c# wpf winforms

2
推荐指数
1
解决办法
3042
查看次数

单击填充了网格的Uniformgrid,获取网格的名称

我是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)

c# wpf uniformgrid

2
推荐指数
1
解决办法
1953
查看次数

在WPF中,如何以编程方式取消选择Treeview中的所有项目?

我正在尝试创建一个递归方法来取消选择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中工作.

c# wpf treeview

2
推荐指数
1
解决办法
4893
查看次数

防止在WPF代码中使用Dispatcher.Invoke

我本质上是一个网络和后端程序员.通常我尝试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)

这是有效的,但这不是唯一的事件,因此使我的代码变得丑陋丑陋.有没有更好的方法来做到这一点?

c# wpf

2
推荐指数
1
解决办法
1945
查看次数

Control.AddRange(...)很慢

项目: 我有一个父面板,其中包含一个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)

我尝试过的事情:

  • 在父面板和/或FlowLayoutPanel上调用SuspendLayout()/ ResumeLayout()。性能提升最小(〜0.2秒)。
  • 在ComboBoxes,Button和DataGridView列上使用Control.FlatStyle.Flat。性能提升最小(〜0.1秒)。
  • 验证我的控件均未使用透明背景色。
  • 将ChildPanel.DoubleBuffered和ParentPanel.DoubleBuffered设置为true。
  • 在调用AddRange()之前从其父级中移除FlowLayoutPanel,然后再重新添加它。 …

.net c# flowlayoutpanel .net-2.0 winforms

2
推荐指数
1
解决办法
3412
查看次数

TaskFactory新UI创建

如何使用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)

vb.net wpf taskfactory

2
推荐指数
1
解决办法
697
查看次数

为什么 UI 不更新(WPF)?

我正在尝试 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)

c# wpf

1
推荐指数
1
解决办法
977
查看次数

WPF中的GridView - 如何使用它?

我看了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)

c# wpf gridview

0
推荐指数
1
解决办法
1392
查看次数

何时将数据加载到ListBox中的最佳实践

WPF/VC++(C++/cx) - Visual Studio 2013

所以我有一个ListBox,其中填充了我创建的UserControl.每次页面更改时数据都会丢失,这是不幸的.因此,我可以选择在每次加载页面时将数据加载到ListBox中,或者在页面之间传递数据.他们每个人都有自己的优势和劣势,但有一种做法更受欢迎吗?

我想要考虑的事情是ListBox中有多少UserControl,这可能是一个很大的数量(大到10000+),以及数据的存储方式.现在我将数据存储在AVLTree中,主要用于组织,因此不需要进行排序.通常只有10页,其中6页通常被导航到(其中4页是很少使用或仅使用过一次的菜单页面),因此数据不必经常在页面之间传递.每个数据节点的大小只有大约1mb,所以不是很大,但是大到足以在你开始超过10000个条目时产生差异(这可能被认为是一种罕见的情况).

我来自游戏编程,因此速度和效率是首要目标.

是的,这是一个主观问题,但是专业人士或一般编程社区可能有一个首选方法.

wpf visual-c++ c++-cx

0
推荐指数
1
解决办法
1982
查看次数

在未从 FrameworkElement 继承的控件中使用 XAML 资源

我有一个需要从 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)

c# wpf xaml

0
推荐指数
1
解决办法
975
查看次数