programing

XAML을 사용하지 않는 WPF

i4 2023. 5. 6. 14:03
반응형

XAML을 사용하지 않는 WPF

건축학적으로, 저는 WPF가 꽤 놀랍다고 생각합니다.일반적으로 저는 기본 렌더링/애니메이션 내부 작업의 열렬한 팬입니다.템플릿 및 스타일링 설정의 유연성은 매우 인상적입니다.

하지만 저는 XAML을 싫어합니다 - 저는 그것이 많은 것을 복잡하게 만든다고 느낍니다.저는 그것을 크고 작은 애플리케이션에 사용해왔고, 기본 원리는 기본이지만 구문은 특이한 XAML에서 무엇인가를 하는 방법을 알아내려고 여러 번 노력해왔습니다.뿐만 아니라, 파싱/바인딩의 특정 부분이 얼마나 무거운지 여러 번 궁금했습니다. (컴파일된 것은 알지만 런타임에 아직도 어느 정도 평가가 되는지는 잘 모르겠습니다.)

XAML은 시각적 트리를 만들고 로드하는 한 가지 방법입니다.XML이 아닌 코드 기반(그러나 여전히 대부분 선언적) 방식으로 시각적 트리 구축을 단순화하기 위한 프레임워크가 있습니까?특히 MVVM 접근 방식을 유지하면서 다음과 같은 문제를 완화하는 프레임워크에 관심이 있습니다.

  1. 강력한 형식의 바인딩입니다.View Model이 특정 유형을 준수해야 함을 지정합니다.저는 BaseBinding이 후드 아래에 반사를 사용한다고 생각합니다. 그리고 그것의 속도에 대해서는 조금 회의적입니다. 깨진 바인딩이 짜증나는 것은 말할 것도 없습니다.

  2. 바인딩,, 비결합INotifyPropertyChanged구속력이 있는그것은 일종의BindableProperty<T>모든 ViewModel 속성 변경사항을 수신하는 대신 바인딩을 직접 수신할 수 있습니다.그리고 직접 콜백과 문자열 인수를 사용하는 것도 유리할 것 같습니다.

  3. 리소스 관리에 대한 다른 접근 방식입니다. 다시 말하지만 강력하게 입력된 사전은 매우 유용할 수 있습니다.저는 람다 같은 스타일이나 강하게 타이핑된 측면을 포착할 수 있는 무언가를 보고 싶습니다.

요약하자면, 비 XAML 기반이고 MVVM과 잘 어울리며 강력한 유형의 프레임워크가 있습니까?

저는 Xaml-free WPF에서 당신을 지지합니다.저는 WPF의 레이아웃과 바인딩 기능을 좋아하지만 XAML도 싫어합니다.WPF가 일반 C#으로 작성될 수 있으면 좋겠습니다. 몇 가지 이점은 다음과 같습니다.

  • 개체컬렉션 초기화자가 Xaml 인스턴스화를 대체할 수 있습니다.(xaml이 버튼업보다 하향식을 선호한다는 것은 유감스러운 일입니다.)
  • 바인딩 변환기는 람다일 수 있습니다.
  • 스타일은 인스턴스화 후 개체를 수정하는 람다일 수 있으며 부풀지 않습니다.<Setter>통사론
  • DataTemplates는 객체가 지정된 컨트롤을 생성하는 람다일 뿐입니다.
  • 데이터 템플릿 선택기는 다른 데이터 템플릿을 호출하는 데이터 템플릿 람다일 뿐입니다.
  • ItemsControl은 람다(DataTemplate)를 가져다가 새 항목이 기본 컬렉션에 추가되면 다시 호출하는 포어에 불과합니다.
  • x:이름은 변수 이름일 뿐입니다.
  • 많 마크업 확장 이 마크업 확장 음않지하요필
    • x:정적
    • x:타입(특히 복잡한 제네릭도!)
  • 사용자 컨트롤은 기능일 뿐입니다.

WPF를 설계하기에는 너무 복잡하다고 생각합니다.웹 개발은 이전의 FrontPage에서 Razor로 이 전투에서 이미 패배했습니다.

단순화?아니요. 하지만 XAML에서 할 수 있는 모든 것은 코드로 할 수 있습니다.예를 들어, 여기 간단한 Windows 잉크 드로잉 앱이 있습니다. 거의 간단하게 만들 수 있습니다.

비주얼 스튜디오가 필요한 사람?

저장이나 변경은 없지만 코드를 통해 변경할 수 있습니다.

Sketchpad.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Ink;

public class Sketchpad : Application {

    [STAThread]
    public static void Main(){
        var app = new Sketchpad();
        Window root = new Window();
        InkCanvas inkCanvas1 = new InkCanvas();

        root.Title = "Skortchpard";

        root.ResizeMode = ResizeMode.CanResizeWithGrip;
        inkCanvas1.Background = Brushes.DarkSlateBlue;
        inkCanvas1.DefaultDrawingAttributes.Color = Colors.SpringGreen;
        inkCanvas1.DefaultDrawingAttributes.Height = 10;
        inkCanvas1.DefaultDrawingAttributes.Width = 10;

        root.Content = inkCanvas1;
        root.Show();
        app.MainWindow = root;
        app.Run();
    }

}

스케치패드.csproj

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
  <PropertyGroup>
    <AssemblyName>Simply Sketch</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="SketchPad.cs" />
  </ItemGroup>
  <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
    <Target Name="Clean">
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

그게 전부야.물론, 만약 당신이 XAML을 피하고 싶다면, 그것은 기본적으로 당신이 많은 대안을 작성해야 한다는 것을 의미합니다.NET 코드, 그래서 그것은 당신에게 달려 있습니다 - 당신은 그것을 XAML로 버리기를 원합니까, 아니면 코드로 쓰기를 원합니까?

VS 내에서 이 작업을 수행할 때 가장 큰 이점은 디자이너의 지원을 잘 받을 수 있다는 것입니다. 따라서 일반적으로 모든 작업이 어디에 있고 어디로 가는지를 시각적으로 쉽게 확인할 수 있습니다.또한 문서를 검색하는 작업이 줄어들고 때로는 몇 단계 도약해야 하는 작업도 줄어들 수 있습니다.

그러나 XAML이 없는 WPF는 가능합니다.

이를 위해 Visual Studio를 설치할 필요도 없습니다.NET CLI 및 개발자 명령 프롬프트.두을 폴더에 " " " 를 실행합니다.msbuild 런다 파음실수있에 할 수 .Bin디렉토리입니다.

이 질문에는 Bling UI Toolkit에 대한 링크가 반드시 필요합니다.WPF 위에 애니메이션과 풍부한 UI 프로토타이핑을 위한 초자연적인 고급 라이브러리입니다.바인딩:button.Width = 100 - slider.Value: 다과같애니이션메은:button.Left.Animate().Duration(500).To = label.Right픽셀 셰이더 컴파일러 - 놀랍다.

안타깝게도, 저는 그 프로젝트가 더 이상 진행되고 있지 않다고 생각합니다.하지만 생각할 거리를 줄 수 있는 아주 똑똑한 아이디어들이 많이 있습니다.

WPF에는 이와 같은 프레임워크가 없습니다.WPF에서 이미 제공하는 구성 요소를 직접(및 다른) 교체하는 것이 위시리스트에 언급된 세 가지 사항입니다.또한 바인딩 및 리소스 시스템을 사용자 버전으로 바꾸면 WPF(애니메이션, 템플릿 등)에 대한 원하는 항목이 바인딩, 리소스 등에 크게 의존하기 때문에 사용할 수 없게 됩니다.

여기 여러분의 경험을 향상시킬 수 있는 몇 가지 제안이 있습니다.
XAML을 다루는 법을 배워라 (나도 그것의 내장을 싫어했지만, 이제 익숙해져서 훌륭하다)
코드로 UI를 쉽게 만들 수 있는 라이브러리를 직접 구축합니다.결국, XAML에서 수행되는 모든 작업은 코드로도 수행될 수 있습니다.
만약 당신이 정말로 INOTIFY를 싫어한다면,속성이 변경되었으며 대신 종속성 속성을 사용하여 콜백을 수행합니다.제기할 이벤트가 없으며, 콜백 및 기본값을 가질 수 있습니다!
4.) WPF를 사용하지 마십시오.아키텍처를 좋아한다고 해도 단점/원하는 '개선사항' 목록은 아키텍처의 거의 모든 부분을 다룹니다.

> non-INotifyPropertyChanged binding.

수동으로 INOTIFY를 구현하려면 다음과 같이 하십시오.뷰 모델 또는 모델에서 변경된 속성은 수동/반복 작업이 상당히 많습니다.하지만 나는 이 대안들에 대해 읽었습니다.

  • DynamicViewModel: 과 함께 POCO를 사용하는 MVVM.NET 4.0 : 이 프로젝트는 Plain Old CLR Objects(POCO)를 사용하여 MVVM(모델 뷰 모델) 아키텍처 패턴을 구현하는 동시에 를 최대한 활용하는 방법을 제공하는 것을 목표로 합니다.NET 4.0 동적 개체 클래스.의 이점을 활용합니다.NET 4.0과 Dynamic Object Class를 사용하면 Dynamic Object Class에서 파생된 유형을 생성하고 런타임에 동적 동작을 지정할 수 있습니다.또한, 우리는 INNotify를 구현할 수 있습니다.파생 유형의 속성 변경 인터페이스로 데이터 바인딩에 적합합니다.

  • 컨트롤 업데이트.NET : INOTIFY 없이 WPF 및 Silverlight 데이터 바인딩속성이 변경되었습니다.종속성을 자동으로 검색하므로 View 모델에서 종속성을 관리할 필요가 없습니다.Winforms와 함께 작동합니다.이벤트를 사용하여 코드를 바인딩합니다.

  • notifypropertywever : IL wabbing을 사용합니다(http://www.mono-project.com/Cecil) 를 통해 INotify를 주입합니다).속성 코드를 속성으로 변경했습니다.

    • 필요한 특성 없음
    • 참조가 필요하지 않음
    • 기본 클래스가 필요하지 않습니다.
    • .net 3.5, .net 4, Silverlight 3, Silverlight 4 및 Windows Phone 7 지원
    • 클라이언트 프로파일 모드 지원

언급URL : https://stackoverflow.com/questions/5729087/wpf-without-xaml

반응형