In lạiTác giả: Tôi là chú chim nhỏThời gian cập nhật: 2023-06-11 22:33:31264
Bản chất của chương trình - cấu trúc dữ liệu + thuật toán.
Bài viết này dựa trên những ghi chú được thực hiện khi nghiên cứu "Hướng dẫn lập trình chuyên nghiệp WPF" do Li Yingbao viết, kết hợp với kinh thánh phát triển WPF "Hướng dẫn lập trình WPF phiên bản thứ 4" và bài viết "Chuỗi hướng dẫn cơ bản về WPF để bắt đầu" của trace master, tương ứng với "Hướng dẫn lập trình chuyên nghiệp WPF" Nội dung giữa Chương 9 chủ yếu phác thảo các nội dung liên quan về các kiểu trong WPF. Tôi hy vọng nó có thể giúp ích cho mọi người.
Từ các nút và hộp văn bản đến hộp thả xuống và hộp danh sách, WPF cung cấp một loạt các điều khiển thường được sử dụng, mỗi điều khiển có những đặc điểm và cách sử dụng riêng. Thông qua các vùng chứa bố cục linh hoạt, chẳng hạn như lưới, bảng ngăn xếp và bảng bao bọc, chúng ta có thể kết hợp các điều khiển này để đạt được bố cục giao diện phức tạp. Và thông qua các kiểu và mẫu, chúng ta có thể dễ dàng tùy chỉnh giao diện và hoạt động của các điều khiển để đáp ứng nhu cầu thiết kế của mình.
Tổng quan
Trong WPF, UI (Giao diện người dùng) được điều khiển bởi dữ liệu. Dữ liệu là cốt lõi. UI phụ thuộc vào dữ liệu và thể hiện dữ liệu. Điều này rất khác với việc phát triển giao diện đồ họa windows truyền thống (chẳng hạn như Winform). Các thành phần UI trong WPF có thể hiển thị dữ liệu và phản hồi các thao tác của người dùng được gọi là các điều khiển. Đồng thời, các điều khiển cũng là vật mang dữ liệu và hành vi. Nội dung hiển thị trong điều khiển được gọi là "nội dung dữ liệu" và phương thức (Phương thức) hoặc sự kiện (Sự kiện) được thực thi để phản hồi các thao tác của người dùng được gọi là "hành vi".
Khái niệm mang tính cách mạng của WPF là tách biệt các đặc điểm và chế độ hiển thị của các thành phần UI (điều khiển). Sự xuất hiện của một điều khiển trên giao diện người dùng được xác định bởi mẫu điều khiển, WPF cung cấp một mẫu điều khiển mặc định và các thuộc tính tương ứng cho mỗi điều khiển. Các mẫu mặc định này ban đầu cung cấp giao diện mặc định của điều khiển. Đồng thời, người dùng cũng có thể thay thế các mẫu mặc định do WPF cung cấp bằng các mẫu của riêng họ và mỗi điều khiển có thể trở thành điều khiển được cá nhân hóa của riêng nhà phát triển.
Trong WPF, có hai cây kế thừa lớp tương tự nhau: một cây liên quan đến giao diện (UI) và một cây liên quan đến nội dung (Nội dung). Thiết kế tách biệt giữa giao diện và nội dung này cho phép WPF xử lý tốt hơn sự khác biệt giữa các thành phần UI và các thành phần nội dung. . nhu cầu.
Cây kế thừa lớp của các thành phần UI dựa trên UIElement, là lớp cơ sở của tất cả các thành phần UI trực quan và có thể được hiểu là một điều khiển.
UIElement cung cấp hỗ trợ cơ bản để xử lý các sự kiện đầu vào, bố cục, kết xuất và các chức năng khác liên quan đến giao diện người dùng. FrameworkElement có nguồn gốc từ UIElement, giúp mở rộng hơn nữa chức năng của các thành phần UI, bao gồm liên kết dữ liệu, kiểu, mẫu, v.v. Lớp Control là một lớp con quan trọng trong FrameworkElement. Nó cung cấp giao diện và hành vi mặc định của một số điều khiển phổ biến.
Cây kế thừa lớp của các thành phần nội dung dựa trên ContentElement, được sử dụng để xử lý các chức năng liên quan đến nội dung, chẳng hạn như hiển thị và xử lý nội dung văn bản.
Tương ứng với nó là FrameworkContentElement, được bắt nguồn từ ContentElement và cung cấp nhiều chức năng liên quan đến nội dung hơn.
Cần lưu ý rằng ContentElement khác với content control (Content Controls): ContentElement chủ yếu được sử dụng để xử lý nội dung văn bản, trong khi content control là loại control dùng để hiển thị và quản lý các thành phần nội dung riêng lẻ.
Biểu tượng điều khiển, so sánh với hình ảnh vết g:
Quay trở lại tiêu đề bài viết, Style trong WPF là một cơ chế quan trọng để xác định hình thức và hành vi của các điều khiển. Nó cho phép các nhà phát triển đóng gói các cài đặt thuộc tính vào các vùng chứa có tên có thể tái sử dụng và có thể áp dụng nhiều lần trong một ứng dụng. Về mặt khái niệm, các kiểu WPF tương tự như CSS trong HTML, nhưng do chức năng mạnh mẽ của các thuộc tính phụ thuộc trong WPF nên WPF có thể sử dụng các kiểu để hoàn thiện các chức năng mà CSS không có.
Mẫu trong WPF là kiểu cấp cao hơn có thể viết lại hoàn toàn giao diện và hoạt động của điều khiển, bao gồm cả bố cục và tương tác của nó. Bằng cách sử dụng các mẫu, nhà phát triển có thể tạo các điều khiển tùy chỉnh có thể có giao diện và mô hình tương tác hoàn toàn khác với các điều khiển cơ sở.
Thuộc tính liên quan
Kiểm soát theo danh mục
Trong WPF, "Thuộc tính liên quan" đề cập đến các thuộc tính có mối liên kết hoặc phụ thuộc nhất định với các thuộc tính của điều khiển hoặc phần tử. Giá trị của các thuộc tính này thường ảnh hưởng lẫn nhau và khi giá trị của một thuộc tính thay đổi thì giá trị của các thuộc tính liên quan khác cũng có thể thay đổi.
Các thuộc tính liên quan phổ biến bao gồm:
Chiều rộng Và Chiều cao : Hai thuộc tính này xác định chiều rộng và chiều cao của điều khiển hoặc phần tử. Chúng thường có mối liên hệ với nhau và khi giá trị của một tài sản thay đổi thì giá trị của tài sản kia cũng có thể bị ảnh hưởng.
Lề Và Đệm : Lề Thuộc tính xác định khoảng trắng giữa điều khiển hoặc phần tử và vùng chứa của nó, trong khi Đệm Thuộc tính xác định những gì bên trong điều khiển hoặc phần tử nội dung Khoảng trống giữa ranh giới của nó. Giá trị của chúng cũng có thể ảnh hưởng lẫn nhau.
Đã bật Và Độ mờ đục : Đã bật Thuộc tính cho biết liệu một điều khiển hoặc phần tử có được bật hay không và Độ mờ đục Thuộc tính được sử dụng để xác định độ mờ của điều khiển hoặc phần tử. khi Đã bật Giá trị của thuộc tính là SAI Khi nào, người ta thường đặt điều khiển hoặc phần tử Độ mờ đục Thuộc tính được đặt thành giá trị thấp hơn để biểu thị trạng thái bị tắt.
Đã kiểm tra 、 Đã chọn Và Khả năng hiển thị : Các thuộc tính này thường được sử dụng trong các điều khiển như hộp kiểm, nút radio và hộp danh sách. Chúng đại diện cho trạng thái đã chọn hoặc khả năng hiển thị của điều khiển hoặc phần tử. Khi giá trị của một trong các thuộc tính thay đổi, nó có thể gây ra những thay đổi trong các thuộc tính liên quan khác.
Đây là một số thuộc tính liên quan phổ biến, tùy thuộc vào loại và chức năng của điều khiển hoặc phần tử. Hiểu được mối quan hệ giữa các thuộc tính liên quan này có thể giúp chúng ta sử dụng và kiểm soát tốt hơn hành vi cũng như hình thức của điều khiển hoặc phần tử.
phong cách
Style chịu trách nhiệm kiểm soát sự xuất hiện và hành vi của các phần tử điều khiển. Nó là tập hợp các giá trị thuộc tính có thể được sử dụng cho các phần tử. Style có thể được coi là một phương thức thuận tiện để áp dụng một tập hợp các giá trị thuộc tính cho nhiều phần tử. Đó là cách tốt nhất để sử dụng tài nguyên. Một trong những lý do phổ biến là để lưu kiểu, hơi giống với tệp css trong Web, nhưng kiểu trong WPF cũng hỗ trợ các trình kích hoạt (Ví dụ: khi phần tử). thuộc tính thay đổi, kiểu điều khiển có thể được thay đổi thông qua trình kích hoạt, điều này làm cho CSS WPF có thể được thực hiện thông qua các kiểu Các chức năng không có sẵn.
Nói một cách đơn giản, phong cách là diện mạo và phong cách của một điều khiển. Trong WPF, phong cách giống như quần áo trên điều khiển.
Kiểu có thể được áp dụng cho một điều khiển duy nhất hoặc cho tất cả các điều khiển trong toàn bộ ứng dụng. Bằng cách xác định kiểu, bạn có thể đặt thuộc tính, hiệu ứng hình ảnh, hình động, mẫu, v.v. của điều khiển để thay đổi giao diện và hành vi của điều khiển. Ngoài ra, kiểu là một công cụ quan trọng để tổ chức và sử dụng lại các tùy chọn định dạng. Chúng ta đều biết rằng mã trùng lặp là một vấn đề. Không nên sử dụng các thuộc tính lặp lại để điền các điều khiển vào xaml. những điểm chính của những chi tiết này. Áp dụng kiểu này cho các điều khiển cần thiết.
Mọi điều khiển trong WPF đều có thuộc tính Style để đặt kiểu:
Đi tới phần định nghĩa Style, chúng ta có thể thấy lớp style Style nằm trong namespace System.Windows:
Trong lớp Kiểu, một số thuộc tính quan trọng được xác định:
TargetType: Loại điều khiển mà kiểu được đặt. Sau khi đặt thuộc tính này, khi đặt thuộc tính Thuộc tính của phần tử trong Setters hoặc Triggers trong XAML, không cần thêm các hạn chế phạm vi lớp (điều này sẽ được đề cập sau).
Setters: Bộ sưu tập đối tượng SetterBase của setter thuộc tính - Lớp SetterBase chủ yếu được sử dụng để kiểm soát kiểu dáng xuất hiện tĩnh của điều khiển.
Trình kích hoạt: Một tập hợp các đối tượng TriggerBase kích hoạt có điều kiện - lớp TriggerBase chủ yếu được sử dụng để điều khiển kiểu hành vi động của điều khiển.
BaseOn: Kế thừa kiểu khác dựa trên kiểu hiện có.
Tài nguyên: Từ điển tài nguyên Bộ sưu tập đối tượng ResourceDictionary.
IsSealed: Có cho phép các kiểu khác được "bắt nguồn" hay không.
Tiếp theo, chúng ta hãy xem xét kỹ hơn từng thuộc tính được sử dụng để làm gì và cách sử dụng các thuộc tính này để cảm nhận cận cảnh sức mạnh kỳ diệu của phong cách.
Người định cư
Setter (setter) là một thuộc tính quan trọng trong lớp Style. Kiểu của nó là SetterBaseCollection, một thùng chứa có thể được đặt vào một đối tượng kiểu SetterBase. Thuộc tính Setter trong Style được sử dụng để đặt giá trị thuộc tính của đối tượng đích. Setter thường được sử dụng để xác định cài đặt thuộc tính theo kiểu nhằm thống nhất hình thức và hành vi của điều khiển.
Setter có hai thuộc tính chính:
Tài sản (Thuộc tính): Chỉ định tên thuộc tính cần đặt. Có thể là bất kỳ thuộc tính phụ thuộc nào (DependencyProperty) hoặc thuộc tính đối tượng phụ thuộc (DependencyObject) [cảnh báo trước ⚠].
Giá trị (giá trị): Chỉ định giá trị cần đặt cho thuộc tính.
Chức năng của Setter là xác định các quy tắc thiết lập thuộc tính theo kiểu để các đối tượng mục tiêu áp dụng cho kiểu sẽ kế thừa các cài đặt thuộc tính này. Khi kiểu được áp dụng cho đối tượng đích, Setter sẽ đặt giá trị của thuộc tính được chỉ định thành giá trị được xác định. Trong các ứng dụng thực tế, chúng tôi hiếm khi sử dụng kiểu cho một điều khiển nhất định. Mục đích của việc sử dụng kiểu là: khi một kiểu nhất định được thay đổi, chúng tôi hy vọng rằng tất cả các điều khiển sử dụng kiểu này sẽ thay đổi biểu thức của chúng, do đó không cần phải sửa đổi một số điều khiển nhất định. từng cái một.
Ví dụ: bạn có thể sử dụng Setter để đặt màu nền, kích thước phông chữ, lề và các thuộc tính khác của điều khiển Nút theo kiểu. Khi bạn áp dụng kiểu này cho điều khiển Nút, các thuộc tính này sẽ tự động được áp dụng và làm cho tất cả các điều khiển Nút trông và hoạt động giống nhau.
Có thể sử dụng nhiều setters trong thẻ
Sau đó xóa tất cả các thuộc tính trong ba Nút Bạn có thể thấy rằng giao diện của các Nút vẫn giống như cài đặt thuộc tính trước đó. Tuy nhiên, phương pháp này linh hoạt hơn nhiều so với trước đây. Khi cần điều chỉnh, chúng ta chỉ cần điều chỉnh chúng. . Các thuộc tính tương ứng trong kiểu có thể làm cho ba nút thay đổi tương ứng:
Chỉ có thể chỉ định một bộ giá trị thuộc tính trong phần tử Setter và có thể đặt nhiều giá trị thuộc tính thông qua nhiều Setter.
TargetType là một thuộc tính trong lớp Kiểu được sử dụng để mô tả đối tượng mà kiểu đã xác định sẽ được áp dụng.
Theo kiểu trên, nhiều phần tử Setter được sử dụng để đặt thuộc tính của nút:
Cho biết rằng bạn bắt đầu xác định tài nguyên trong phần tài nguyên của cửa sổ, chứa các kiểu.
Cho biết việc xác định kiểu cho điều khiển Nút.
Đặt màu nền của Nút thành màu xanh lá cây.
Đặt lề của Nút thành 5 đơn vị.
Đặt cỡ chữ của Nút thành 16.
Đặt nội dung của Nút thành "Cắn tôi!".
Đặt màu nền trước của Nút (màu văn bản) thành màu đỏ.
Tại sao phải xác định kiểu trong Tài nguyên? Rõ ràng là chúng ta không thể chỉ sử dụng các kiểu trong một điều khiển cụ thể, nhưng tất nhiên điều này cũng có thể thực hiện được trong WPF:
Tuy nhiên, phương pháp định nghĩa này hoàn toàn giống với cách chúng ta xác định hình thức của từng nút riêng biệt ngay từ đầu, điều này rõ ràng làm mất đi ý nghĩa của việc sử dụng kiểu. Xác định kiểu trong Window.Resources và kiểu này sẽ áp dụng cho tất cả các điều khiển Nút trong Cửa sổ (biểu mẫu) hiện tại. Điều này có nghĩa là tất cả các nút sẽ có nền màu xanh lá cây, 5 đơn vị đệm, cỡ chữ 16, hiển thị văn bản "Bite Me!" và màu nền trước màu đỏ. Tại thời điểm này, bạn có thể trực tiếp sửa đổi kiểu Nút bằng cách sửa đổi Giá trị của các thuộc tính tương ứng trong kiểu. Không cần đặt riêng các thuộc tính này cho từng điều khiển Nút, điều này có thể đơn giản hóa rất nhiều công việc thiết kế và bảo trì giao diện.
❗❗❗Chuyển đổi bảng: Như đã đề cập ở trên, hiệu ứng kiểu được xác định bây giờ có nghĩa là tất cả các nút sẽ có nền màu xanh lá cây, lề 5 đơn vị, cỡ chữ 16, hiển thị văn bản "Bite Me!" và màu đỏ. nếu có một nút không cần phải đặt theo kiểu này hoặc nó có giao diện khác? Đừng lo lắng, có ba giải pháp:
bạn cho mỗi cái Cái nút Việc đặt lại các thuộc tính bắt buộc sẽ ghi đè kiểu đã đặt (mức độ ưu tiên của các thuộc tính), điều này rõ ràng là đi ngược lại mục đích sử dụng kiểu ban đầu.
sử dụng {x: Không} Xóa rõ ràng Phong cách
Đặt tên cho kiểu đã xác định x:phím , hãy tìm nó bằng tên này khi cần {Giá trị khóa StaticResource} , rất thuận tiện khi xác định các kiểu khác nhau cho cùng một điều khiển. Ví dụ: chúng ta có thể tạo hai kiểu khác nhau Cái nút :
Nội dung trên là cách sử dụng Setter và định nghĩa, cách sử dụng chung của các style.
Kế thừa phong cách BaseOn
BaseOn cũng là một trong một số thuộc tính quan trọng trong kiểu, được sử dụng để chỉ định kiểu hiện có mà kiểu hiện tại dựa vào để kế thừa và mở rộng. Bằng cách đặt thuộc tính BaseOn, bạn có thể tạo kiểu mới, sửa đổi kiểu hiện có hoặc thêm cài đặt mới. Thông qua việc sử dụng thông minh các thuộc tính BaseOn, chúng tôi có thể xây dựng các cung điện trực quan mê hoặc người dùng. Cho dù đó là kế thừa các tác phẩm kinh điển, mở rộng đổi mới hay định hình lại phong cách, các thuộc tính của BaseOn` chính là trợ thủ đắc lực của chúng tôi.
Cú pháp cơ bản như sau:
Kiểu NewStyle được khai báo sẽ kế thừa tất cả cài đặt được xác định trong ExistingStyle và sau đó bạn có thể thêm, sửa đổi hoặc ghi đè cài đặt thuộc tính bắt buộc trong NewStyle. Việc sử dụng thuộc tính BasedOn có thể tăng khả năng sử dụng lại các kiểu, bằng cách tạo các kiểu mới dựa trên các kiểu hiện có, bạn có thể áp dụng các kiểu một cách nhất quán trong toàn bộ ứng dụng của mình và thực hiện các thay đổi thống nhất khi cần.
Ví dụ: trong kiểu ButtonStyle1 ở ví dụ trên, chúng ta cần một nút có nội dung hiển thị in nghiêng và in đậm. Tất nhiên không có vấn đề gì khi tạo một kiểu mới, nhưng việc đặt màu nền, điều chỉnh khoảng cách, cỡ chữ và màu phông chữ phải được viết lại, sử dụng nhiều thời gian nhất để tạo giá trị thấp nhất. Lúc này, bạn có thể kế thừa kiểu ButtonStyle1 và thêm các kiểu bổ sung:
Màu đỏ và màu xanh lá cây trông thật ngớ ngẩn.
Mặc dù việc kế thừa kiểu thông qua BaseOn thoạt nhìn có vẻ rất thuận tiện nhưng nó cũng có một số nhược điểm cần lưu ý:
Khớp nối kiểu chặt chẽ: sử dụng Dựa trên Khi các thuộc tính kế thừa kiểu, kiểu con sẽ phụ thuộc chặt chẽ vào kiểu gốc. Điều này có nghĩa là nếu kiểu cha mẹ thay đổi thì kiểu con cũng có thể bị ảnh hưởng, dẫn đến những thay đổi kiểu không mong muốn. Kiểu khớp nối chặt chẽ này có thể làm tăng độ phức tạp của việc bảo trì mã.
Khả năng đọc mã giảm: Khi hệ thống phân cấp kế thừa kiểu trở nên sâu, khả năng đọc mã có thể giảm. Khi đọc mã, bạn cần theo dõi các mối quan hệ kế thừa kiểu và việc hiểu vai trò cũng như tác dụng của từng kiểu có thể trở nên khó khăn hơn.
Sự dư thừa về phong cách và tác động đến hiệu suất: Sử dụng Dựa trên Khi các thuộc tính kế thừa kiểu, kiểu phụ có thể kế thừa một số thuộc tính hoặc kiểu không cần thiết, dẫn đến kiểu dư thừa. Điều này có thể làm tăng thời gian kết xuất và mức tiêu thụ bộ nhớ của giao diện và có tác động nhất định đến hiệu suất. Đồng thời, việc tăng mức kế thừa kiểu cũng có thể khiến quá trình phân tích cú pháp và ứng dụng kiểu bị chậm lại.
Khó khăn trong việc gỡ lỗi và định vị các vấn đề: Khi hệ thống phân cấp kế thừa kiểu phức tạp, nếu xảy ra sự cố về kiểu hoặc cần phải gỡ lỗi, thì có thể cần phải theo dõi và định vị nhiều kiểu, làm tăng độ phức tạp của việc gỡ lỗi.
Các phụ thuộc được tạo ra bởi kế thừa kiểu sẽ làm cho chương trình dễ vỡ hơn. Tuy nhiên, thông thường, các kiểu khác nhau sẽ xuất hiện tùy theo các loại nội dung khác nhau và vai trò của nội dung đó. là một mô hình phức tạp hơn, với ít cài đặt kiểu được sử dụng lại thực sự hơn. Không nên kế thừa kiểu trừ khi có lý do đặc biệt để một kiểu kế thừa từ kiểu khác (ví dụ: kiểu thứ hai là trường hợp đặc biệt của kiểu đầu tiên và chỉ thay đổi một vài tính năng trong một tập hợp lớn các cài đặt được kế thừa).
Trình kích hoạt
Trình kích hoạt được sử dụng để thay đổi giao diện hoặc hành vi của điều khiển khi đáp ứng các điều kiện cụ thể. Chúng là một công cụ mạnh mẽ để triển khai các hiệu ứng điều khiển động nhằm đáp ứng sự tương tác của người dùng, thay đổi dữ liệu hoặc các sự kiện khác.
Trình kích hoạt có thể được xác định trong Kiểu hoặc ControlTemplate của mẫu điều khiển. Chúng kích hoạt các hành động hoặc cài đặt cụ thể dựa trên giá trị của thuộc tính.
Có một số loại trình kích hoạt trong WPF, bao gồm:
Cò súng : Được sử dụng để kích hoạt hành động hoặc cài đặt khi giá trị thuộc tính đáp ứng các điều kiện cụ thể. Ví dụ: thay đổi màu nền của nút khi nhấp vào.
Đa kích hoạt :Và Cò súng Tương tự nhưng có thể thỏa mãn điều kiện của nhiều thuộc tính cùng một lúc.
Trình kích hoạt dữ liệu : Kích hoạt hành động hoặc cài đặt dựa trên giá trị giới hạn dữ liệu. Ví dụ: ẩn điều khiển khi dữ liệu bị ràng buộc đạt đến một giá trị nhất định.
Đa dữ liệu kích hoạt :Và Trình kích hoạt dữ liệu Tương tự nhưng có thể thỏa mãn nhiều điều kiện ràng buộc dữ liệu cùng một lúc.
Sự kiệnKích hoạt : Kích hoạt một hành động hoặc cài đặt khi một sự kiện cụ thể xảy ra. Ví dụ: thay đổi độ trong suốt của điều khiển khi chuột di chuyển qua nó.
Các loại trình kích hoạt này có nguồn gốc từ lớp TriggerBase. DataTrigger và MultiDataTrigger là một cặp trình kích hoạt dữ liệu. Sự khác biệt giữa hai trình kích hoạt này là DataTrigger chỉ có thể chỉ định một điều kiện, trong khi MultiDataTrigger có thể chỉ định nhiều điều kiện. Trigger và MultiTrigger cũng là một cặp trigger, tương tự như DataTrigger chỉ có thể chỉ định một điều kiện, trong khi MultiTrigger có thể chỉ định nhiều điều kiện. Điểm khác biệt giữa DataTrigger và Trigger là DataTrigger có thuộc tính Banding, tức là DataTrigger hỗ trợ liên kết dữ liệu.
Trình kích hoạt thường được sử dụng cùng với bộ cài đặt để thay đổi thuộc tính của điều khiển khi được kích hoạt. Chúng ta có thể đặt các giá trị thuộc tính mới trong trình kích hoạt và có thể áp dụng các hiệu ứng hoạt ảnh hoặc các thao tác phức tạp hơn khác.
Hãy thử kích hoạt một cách ngắn gọn:
Cò súng
Trình kích hoạt đơn giản và cơ bản nhất, chúng tôi sử dụng một ví dụ nhỏ để minh họa và cũng như một đánh giá nhỏ về kiểu, chẳng hạn để đạt được hiệu quả làm cho phông chữ văn bản lớn hơn khi di chuột qua:
Hãy cẩn thận để tránh các vòng lặp vô hạn khi sử dụng trình kích hoạt. Không sử dụng các thuộc tính liên quan được đặt trong trình kích hoạt làm điều kiện của trình kích hoạt. Nghĩa là, việc thay đổi thuộc tính liên quan A sẽ khiến thuộc tính liên quan B thay đổi và thay đổi thuộc tính liên quan. B làm cho thuộc tính liên quan A thay đổi.
Đa kích hoạt
Thực hiện hiệu ứng nhập khi gõ, đường viền trở nên dày hơn để nhắc bạn về trạng thái nhập và màu nền cũng thay đổi:
DataTrigger và MultiDataTrigger
Cặp trình kích hoạt DataTrigger và MultiDataTrigger rất giống với Trigger và MultiTrigger, nhưng chúng có thuộc tính Binding bổ sung, yêu cầu liên kết dữ liệu, điều này sẽ được thảo luận sau.
Sự kiệnKích hoạt
Trình kích hoạt sự kiện tương tự như tia sét nhỏ trong winform, thực hiện các hành động tương ứng bằng cách kích hoạt các sự kiện cụ thể. Chúng tôi sử dụng hoạt ảnh để thực hiện một minh họa nhỏ:
Đã lưu trữ
Mã được định dạng có vẻ hơi dài.
Xác định kiểu thành các tệp riêng biệt
Trong ví dụ được trình bày ở trên, các kiểu được xác định trong tài nguyên của trang nơi đặt điều khiển đích. Chỉ các điều khiển trên trang hiện tại mới có thể áp dụng kiểu. Theo cách này, phương pháp định nghĩa kiểu có vẻ hơi yếu khi kết hợp chéo. trang xảy ra. Hãy tưởng tượng rằng phần mềm của bạn có nhiều trang và mỗi trang có nhiều nút, hộp văn bản, nhãn và các điều khiển khác. Nếu mỗi điều khiển đặt giá trị thuộc tính của chúng theo cách thủ công để đạt được giao diện nhất quán thì việc này sẽ rất tẻ nhạt và dễ xảy ra lỗi. Trong các dự án phần mềm lớn, khi bạn cần phát triển nhiều ứng dụng WPF hoặc DLL, điều rất quan trọng là phải đảm bảo rằng các ứng dụng này có giao diện nhất quán. Đây chính là sức mạnh thực sự của Styles.
Không phải các chương trình ngày nay thường có chức năng tùy chỉnh chủ đề sao? Bạn có thể tự do sửa đổi hiệu ứng trang bằng cách điều chỉnh các mục cấu hình nhất định và chuyển đổi giữa chủ đề sáng và tối. Mặc dù WPF không có những thứ như Theme và Skin nhưng chúng ta có thể hoàn thành tốt công việc này thông qua các style.
Hãy thử thực hiện chuyển đổi chủ đề sáng và tối đơn giản:
Hãy xem nó được thực hiện như thế nào:
Xây dựng từ điển chủ đề
Khá là chán. Mình extract Style ra và chuyển màu không biết có chuẩn không.
Hai từ điển tài nguyên lần lượt được tạo ra là: DirectoryDarkStyle.xaml và DirectoryDefaultStyle.xaml để lưu trữ theme mặc định và dark theme. Mã xaml tương ứng như sau:
Mặc định
Tối tăm
Tải từ điển tài nguyên chủ đề chuyển đổi
Thêm tài nguyên của chương trình trong App.xaml, đây là từ điển tài nguyên mà chúng tôi đã xác định:
sử dụng System.Windows; không gian tên ThemeSwitchDemo { /// /// Logic tương tác của MainWindow.xaml /// lớp công khai MainWindow : Window { public MainWindow() { Khởi tạoComponent() } bool isDarkStyleApplied = sai; nút void riêng tư_Click(người gửi đối tượng, RoutedEventArgs e) { if (isDarkStyleApplied) { // Nếu kiểu hiện tại là màu đen, hãy chuyển về đường viền kiểu mặc định.Style = (Style)Application.Current.Resources["BorderDefaultStyle"]; .Style = (Style)Application.Current.Resources["LabelDefaultStyle"] nút.Style = (Style)Application.Current.Resources["ButtonDefaultStyle"]; isDarkStyleApplied = false; } else { // Nếu kiểu hiện tại là kiểu mặc định, hãy chuyển sang đường viền kiểu màu đen.Style = (Style)Application.Current.Resources[ "BorderDarkStyle" ]; nhãn1.Style = (Style)Application.Current.Resources["LabelDarkStyle"]; label2.Style = (Style)Application.Current.Resources["LabelDarkStyle"]; nút.Style = (Style)Application.Current.Resources["ButtonDarkStyle"];
Vậy thôi.
Có lẽ đó là vì tôi là người mới bắt đầu. Tôi nghĩ nên có cách nào tốt hơn để thực hiện nó hơn cách của tôi. Mọi người đều có thể để lại tin nhắn để thảo luận. Một điều nữa, các Chiến binh Bò không bao giờ tháo mặt nạ ra.
Cuối cùng, bài viết về Ghi chú bắt đầu WPF-03-Cơ bản về kiểu này kết thúc tại đây. Nếu bạn muốn biết thêm về Ghi chú bắt đầu WPF-03-Cơ bản về kiểu, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. blog của tôi trong tương lai! .
Hive - Giới thiệu về Hive Apache Hive là một hệ thống kho dữ liệu nguồn mở được xây dựng trên Hadoop. Nó có thể ánh xạ các tệp dữ liệu có cấu trúc và bán cấu trúc được lưu trữ trong các tệp Hadoop vào một bảng cơ sở dữ liệu.
HBase - Giới thiệu về HBase HBase là cơ sở dữ liệu nguồn mở phân tán, định hướng theo cột. Công nghệ này xuất phát từ bài viết của Google "Bigtable: A Distributed Storage System for Structured Data" do Fay Chang viết.
Zero: Hiện trạng của front-end Lịch sử phát triển của front-end HTML(5), CSS(3), JavaScript(ES5, ES6): Viết từng trang -> cho back-end (PHP, Python, Go, Java) ->
Trong hướng dẫn này, bạn sẽ tìm hiểu về các cách khác nhau để chạy JavaScript trên máy tính của mình. JavaScript là ngôn ngữ lập trình phổ biến với nhiều ứng dụng. JavaScript từng được sử dụng chủ yếu để làm cho các trang web có tính tương tác
Tôi từng là một người mới vào nghề, chưa biết gì về lập trình nhưng bị thúc đẩy bởi sự tò mò và khao khát kiến thức về thế giới Internet, tôi đã bước chân vào cung điện lập trình. Trong quá trình học, tôi đã khám phá ra một ngôn ngữ lập trình kỳ diệu - Python. Python có cú pháp ngắn gọn và dễ đọc, cho phép người mới bắt đầu sử dụng
Xin chào các độc giả thân mến! Hôm nay tôi muốn chia sẻ với các bạn một số trường hợp nhỏ về Python crawler. Bạn đã bao giờ phải lo lắng về việc lấy dữ liệu từ một trang web cụ thể chưa? Hoặc tò mò về cách trích xuất thông tin từ một trang web để sử dụng cho riêng bạn? Vâng, bài viết này sẽ cung cấp cho bạn một số nguồn cảm hứng và cảm hứng.
đóng cửa. Câu hỏi này dựa trên ý kiến. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện câu hỏi này? Cập nhật câu hỏi để việc chỉnh sửa bài đăng này có thể trả lời nó bằng sự thật và trích dẫn. . Đã đóng cửa 8 năm trước. cải tiến
Tôi muốn tạo một ứng dụng như https://apprtc.appspot.com/?r=04188292. Tôi biết một chút về webrtc nhưng không thể hiểu được google app-engine. làm thế nào để java
Tôi mới bắt đầu sử dụng Python và viết một chương trình ngoại vi đơn giản. Tuy nhiên, bất cứ khi nào tôi gõ pythonchu vi.py trong thiết bị đầu cuối, tôi gặp lỗi sau và tôi không biết cách khắc phục. >>> thời kỳ trăn
Redis có 5 cấu trúc dữ liệu cơ bản là string, list, hash, set và zset. Chúng là những cấu trúc dữ liệu được sử dụng thường xuyên nhất trong quá trình phát triển hàng ngày. Nếu hiểu rõ về 5 cấu trúc dữ liệu này, bạn sẽ nắm vững được một nửa kiến thức về ứng dụng Redis.
Các bước cụ thể để tạo và xuất bản một dự án web: 1. Tạo một dự án web động helloword trong công cụ phát triển 2. Tạo tệp index.html trong webContent 3. Xuất bản ứng dụng web lên
Nếu bạn sử dụng thiết bị đầu cuối trên Ubuntu trong một thời gian dài, bạn có thể muốn điều chỉnh phông chữ và kích thước của thiết bị đầu cuối để có trải nghiệm tốt. Thay đổi phông chữ là một trong những cách đơn giản nhất nhưng trực quan nhất để tùy chỉnh thiết bị đầu cuối Linux của bạn. để tôi
1. Giới thiệu ADODB là tên viết tắt của Active Data Objects Data Base. Nó là một thành phần chức năng để PHP truy cập cơ sở dữ liệu. Bây giờ hệ thống SFS3 (Hệ thống học thuật mạng trao đổi phần mềm miễn phí trong khuôn viên trường) đã được lên kế hoạch
Tôi hoàn toàn mới làm quen với neo4j và tôi xin lỗi vì đã hỏi một câu hỏi cơ bản như vậy. Tôi đã cài đặt neo4j và tôi đang sử dụng shell "localhost:7474/webadmin/#/console/" Tôi đang tìm một ví dụ điển hình
Tôi đang đọc Core Audio cho iOS 4 với mục đích xây dựng một ứng dụng thử nghiệm nhỏ. Tại thời điểm này, tôi rất bối rối với tất cả các nghiên cứu về api. Lý tưởng nhất là tôi muốn biết cách trích xuất một số mẫu từ hai bản mp3 thành một mảng. và sau đó trong vòng lặp gọi lại
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Các câu hỏi yêu cầu chúng tôi giới thiệu hoặc tìm công cụ, thư viện hoặc tài nguyên yêu thích bên ngoài trang web đều không liên quan đến Stack Overflow vì
Tôi đã tải xuống GNUStep và cài đặt nó nhưng tôi không biết tìm IDE ở đâu. Có ai biết chương trình nào có thể được sử dụng làm GNUStep IDE/lấy chúng ở đâu không? Mặt khác, có ai biết gì về cách tạo và biên dịch chương trình GNUStep cơ bản không
Tôi đang cố gắng bắt đầu sử dụng Apache Solr, nhưng có một số điều tôi chưa hiểu rõ. Đọc qua hướng dẫn, tôi đã thiết lập một phiên bản Solr đang chạy. Điều khiến tôi bối rối là tất cả cấu hình (lược đồ, v.v.) của Solr đều ở định dạng XML.
Có tài liệu nào về cách bắt đầu sử dụng BruTile không? Tôi hiện đang sử dụng SharpMap và tôi cần lưu trước các ô vào bộ đệm để tăng tốc quá trình Câu trả lời hay nhất Tôi đang làm việc này hôm nay :) Trang web dự án Mapsui phụ thuộc rất nhiều vào SharpMap
Cố gắng hết sức nhưng tôi không thể yêu cầu CEDET làm bất cứ điều gì. Emac 24.3. Tôi đã tải xuống ảnh chụp nhanh CEDET mới nhất. Tôi lấy phần thiết lập của Alex Ott từ phía dưới của anh ấy (không phải vậy) Giới thiệu nhẹ nhàng
Tôi là một lập trình viên xuất sắc, rất giỏi!