小编803*_* DX的帖子

消除引用后,XAML按钮不会被垃圾回收

我写了一个测试程序,其中单个Button在XAML中定义为a的内容Window.在窗口加载时,以Button编程方式替换为窗口的内容,并且引用它的字段也由Button我以编程方式创建的另一个字段替换.之后我Button使用弱引用跟踪两个对象,并以1/10秒的间隔轮询IsAlive每个对象的属性.在第IsAlive一次调用轮询方法的第一次检查之前,我也删除了以编程方式定义的生根引用Button.

运行此代码的期望是,尽管C#垃圾收集的时间不确定,但两个Button对象最终都会被报告为垃圾收集.尽管以编程方式定义Button了这种行为,通常在1/2分钟内,但从Button不收集XAML .看到这种行为,我已经让程序运行了十多分钟.

谁能告诉我为什么Button没有收集XAML 对象?特别是,我想知道垃圾收集阻止引用的位置,它是在我的代码中还是在WPF实现中.也许它在XAML加载对象中.我在看某种内存泄漏吗?

上面描述的程序包括在下面以供参考.

MainWindow.xaml:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="300" Height="150" Loaded="Window_Loaded">
    <Button Name="btn" />
</Window>
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml.cs:

namespace Test {
    public partial class MainWindow : System.Windows.Window {

        private System.WeakReference wr_xamlBtn, wr_programmaticBtn;

        public MainWindow() {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e) {

            // Immediately upon the window's loading, create a weak …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml garbage-collection memory-leaks

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

限制类方法访问另一个类

问候.

我有两个班,'数据库'和'组'.我希望能够在"数据库"中创建"组"实例并在这些实例上调用方法,并能够公开分发"组"实例引用.但是,我不想提供对"组"中的构造函数或其他方法的公共访问.

我原本以为我可以通过使'Group'成为'Database'的私有内部类来实现这种访问限制,但我发现如果它是私有的,我不能公开分发对'Group'的引用.此外,我将'Group'设为公共内部类的尝试失败了,因为如果它的方法都是私有的,'Database'无法访问它们,如果它们是公共的,那么访问可能超出'Database'.

我正在寻找解决或避免这个问题的最佳实践技术.也许我错过了某个必要的关键字?到目前为止,我在研究中发现的任何内容都表明C#允许这种控制粒度.我找到了解决问题的混乱方法,正如我在下面的代码中提供的那样.它的本质是这样的:在"数据库"中每次调用"组"中的方法之前,在"数据库"中设置一个字段,可以公开读取,但只能私下设置,"组"的方法都会检查它们的创建实例'数据库'在执行预期的操作之前.在读取字段时(通过"数据库"中的公共方法),字段将被重置,防止对"组"进行任何进一步的方法调用,直到"数据库"再次设置字段.

public class Database {

    // Field; true if Database has just authorized a method call to a %Group.
    private bool group_isNextCallAuthorized = false;

    // Invoked before every method call to a %Group.
    private void Group_AuthorizeNextCall() {
        group_isNextCallAuthorized = true;
 }

    // Method, ordinarily called from %Group, that checks its creating %Database
    //  that the %Database itself authorized the method call on the %Group. It
    //  automatically resets the authorization to false to prepare for the …
Run Code Online (Sandbox Code Playgroud)

c# access-modifiers restriction

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

使分隔线与收缩包装容器的宽度相匹配?

我想构建一个包含两个Text小部件和一个Divider垂直堆叠的小部件的小部件。它们的Divider宽度应与两个小部件中较宽的一个相同Text。整个组合的小部件不应消耗比其可见元素更多的布局空间;也就是说,它应该被收缩包装。

我希望它看起来像下图所示:

在此输入图像描述

(我在这里添加浅灰色背景只是为了使我想要的边界框更加明显。)

我不清楚如何同时强制小部件层次结构采用文本的自然最大宽度,同时使宽度Divider拉伸到仅与文本的宽度一样大。如果可能的话,我想在不编写任何自定义布局小部件的情况下执行此操作,并且不直接为Divider第一个布局或渲染通道之后的小部件的使用测量值分配宽度。

这是我在 DartPad ( https://dartpad.dev/flutter ) 中尝试的一些代码,但是,自然地,它没有达到预期的效果:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(
      child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
        Text("Lorem ipsum"),
        Text("dolor"),
        Divider(thickness: 1.0, color: Colors.red),
      ]),
    )));
  }
}
Run Code Online (Sandbox Code Playgroud)

我的最终目标是拥有可在 Android Studio 3.5.3、Windows 10 64 位中运行的代码。如何修复(或替换)我的代码来实现此目的?

dart flutter flutter-layout

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